2016-09-28 75 views
4

我正在循環中運行script.sh。該腳本包含一個並行的wget命令。我收到以下錯誤:如何在使用GNU並行的Bash腳本中避免SIGCHLD錯誤

Signal SIGCHLD received, but no signal handler set. 

循環是這樣的:

for i in {1..5}; do /script.sh; done 

,這是導致錯誤的行看起來像這樣(忽略選項和設置):

cat file.txt | parallel -j15 wget 

研究:

我不是一個EXP與GNU並行,但腳本似乎大部分時間工作正常,除非我得到上述錯誤。在查看SIGCHLD時,我瞭解到並行運行可以創建「殭屍進程」,有時我們需要「收穫」這些進程。另外,我發現你可以殺死進程,因爲有時他們可以佔用所有可用的連接。

試圖瞭解:

不過,我不知道是什麼原因造成這個問題擺在首位。這是我的平行嗎?我不是「收穫」過程嗎?我應該明確殺死進程嗎?是否因爲我在循環中運行並行腳本?

我的問題:

我怎樣才能解決這個SIGCHLD錯誤?

如果您有任何這方面的經驗,非常感謝您的洞察力。

+0

您使用的是什麼版本的並行版本? – ccarton

+0

GNU並行20160822(我相信最新的一個) – DomainsFeatured

+0

我認爲這可能是一個並行的錯誤。我正在查看代碼,作者正在刪除sigchld處理程序。也許在一些與忽略信號具有相同效果的環境中,但是perl文檔說您通過將處理程序設置爲「IGNORE」來忽略信號。如果刪除處理程序,會發生什麼情況。如果可以,請嘗試恢復到版本20150222。 – ccarton

回答

1

我認爲這可能是一個並行的錯誤。代碼中有一點是作者正在刪除sigchld處理程序,可能是爲了忽略信號。 perl文檔沒有說明會產生什麼效果,這對我意味着結果是平臺或實現依賴性和不可靠性。忽略信號的正確方法是將處理程序設置爲「INGORE」。我建議嘗試版本20150222,這是一個老版本,確實有這個有問題的代碼。

+0

如果這個作品的地方嘗試在20160922(4361行)做出同樣的改變,看看是否修復它。 –

0

(這只是一條評論,但對於評論太長)。

到目前爲止,還沒有人能夠可靠地重現錯誤。看看你是否可以製作一個MCVE https://stackoverflow.com/help/mcve。如果忽略建議解決問題,然後修復應該是從parallel改線4361:

delete $SIG{CHLD}; 

到:

$SIG{CHLD} = 'IGNORE'; 

讓我們知道,幫助,因此它可以被投入下一個版本,如果它工作。

+0

嗨@OleTange,讓作者幫我解決問題,我覺得很特別。非常感謝。實際上,在本文之前我已經回到了Parallel-20150222,並且幾次運行這個腳本沒有任何錯誤。我會繼續測試以確定。這是否足以提供比較「IGNORE」設置的信息?否則,如果它對您有幫助,我可以重新安裝最新版本並嘗試進行測試。雖然,我不太確定把'$ SIG {CHLD} ='IGNORE'放在哪裏,如果它放在終端,腳本的頂部或包中的某處。再次感謝:-) – DomainsFeatured

+0

在腳本並行中更改第4361行。 –

+0

請看看你是否可以製作一個MCVE。這仍然是非常有幫助的。 –