2013-05-10 80 views
1

我似乎有一個僵局。我有perl腳本分叉和調用另一個perl腳本。這個過程掛在某個地方。過程掛起和PIPE被阻止

我正在運行該程序: Darwin內核版本12.3.0:Sun Jan 6 22:37:10 PST 2013;根:XNU-2050.22.13〜1/RELEASE_X86_64 x86_64的

「lsof的」 具有4個條目是指相同的PIPE:

perl5.12 1414根1個PIPE 0x48937dc1254fe937 16384 - > 0x48937dc1254fe727

的perl5。 12 1768根1個PIPE 0x48937dc1254fe937 16384 - > 0x48937dc1254fe727

perl5.12 1759根1 PIPE 0x48937dc1254fe937 16384 - > 0x48937dc1254fe727

perl5.12 1760根1個PIPE 0x48937dc1254fe937 16384 - > 0x48937d c1254fe727

我懷疑這是掛起的原因。 我們是否有任何命令可以告訴我哪個進程讀取/寫入此PIPE? 或任何進一步的信息,將不勝感激。 在此先感謝!

+0

好問題,但脫離這裏的話題。嘗試serverfault或超級用戶。 – pilcrow 2013-05-11 04:09:53

回答

0

有兩種可能的可能性我能想到的:由於輸出緩衝

  1. 還有的僵局。嘗試在所有輸出管道上啓用自動刷新。如果兩個進程使用管道進行雙向通信,那麼這很可能:它們每個都會寫入內容並等待讀取響應,但由於輸出被緩衝,響應永遠不會發送到管道。

  2. 進程正在等待管道上的EOF,但它永遠不會到來。如果管道是在父進程中創建的,然後由子進程繼承的,則需要確保所有進程都關閉管道的寫入端,以便讀者讀取EOF。

+0

感謝您的及時迴應。我嘗試在掛起(ps -ax)的腳本上爲所有fds(fd-> autoflush;)啓用autoflush。但它有助於。我也確保所有的開放都關閉。有什麼方法可以知道哪些腳本可能讀取或寫入PIPE?謝謝你。 – AnuRV 2013-05-11 00:02:15

+0

我可以關閉特定進程的所有打開文件句柄嗎?我沒有proc文件系統(/ proc//fd)。 – AnuRV 2013-05-13 22:11:11

+0

也許你可以用'dtruss'來看看每個進程在做什麼。但是我認爲你會發現它們都是在'read()'中,我不知道這會有多大幫助。 – Barmar 2013-05-13 22:24:25