2016-09-28 11 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 Parallelでertを実行すると、上記のエラーが出る場合を除いて、スクリプトはほとんどの場合正常に動作しているようです。 SIGCHLDを見ているうちに、並行して実行すると「ゾンビプロセス」が作成され、時にはこれらのプロセスを「刈り取る」必要があることが分かりました。また、時には利用可能なすべての接続を利用できるため、プロセスを強制終了できることがわかりました。

をしかし、私は最初の場所で問題を引き起こしているのか分からない。理解しようと

。それは私の類似点ですか?私はプロセスを「刈り取っていませんか?明示的にプロセスを強制終了する必要がありますか?私はループ内で並列スクリプトを実行しているからですか?

私の質問:

どのように私はSIGCHLDエラーを解決できますか?

このような経験をお持ちの場合は、洞察を深めることができます。

+0

使用している並列バージョンは何ですか? – ccarton

+0

GNU parallel 20160822(私が信じる最新のもの) – DomainsFeatured

+0

これは並行してバグかもしれないと思います。私はコードを見ていて、作者はある時点でsigchldハンドラを削除しています。おそらく、シグナルを無視するのと同じ効果がある環境では、perlのドキュメントでは、ハンドラを "無視"に設定してシグナルを無視すると言われています。ハンドラを削除すると何が起こるかはわかりません。できる場合は、バージョン20150222に戻してみてください。 – ccarton

答えて

1

これは並行してバグかもしれないと思います。コードには、作者がsigchldハンドラを削除している点があります。おそらく、シグナルを無視する方法です。 perlのドキュメントは、結果がプラットフォームやインプリメンテーションに依存し、信頼できないことを示唆しています。シグナルを無視する適切な方法は、ハンドラを「INGORE」に設定することです。私はバージョン20150222、この疑わしいコードを持っている古いバージョンを試してみることをお勧めします。

+0

それがうまくいくならば、20160922(4361行目)に同じ変更を加えて修正するかどうか確認してください。 –

0

(これは単なるコメントですが、コメントするには長すぎます)。

これまで、誰もバグを確実に再現することはできませんでした。あなたがMCVE https://stackoverflow.com/help/mcveを作ることができるかどうか見てください。

delete $SIG{CHLD}; 

$SIG{CHLD} = 'IGNORE'; 

それが助け場合はお知らせので、それをに入れることができIGNORE提案は、問題を解決した場合、修正はからparallelにライン4361を変更しなければなりません次のバージョンであれば動作します。

+0

ちょっと@OleTange、私は非常に私を助けてくれる作家を持って特別に感じる。どうもありがとうございます。私はこの郵便の前に昨日Parallel-20150222に戻りましたが、エラーなしで数回スクリプトを実行しました。私はそれが確実であることをテストし続けます。これは "無視"設定を比較するのに十分な情報でしょうか?そうでなければ、それがあなたを助けるならば、私は最新のバージョンを再インストールし、それをテストしようとすることができます。しかし、$ SIG {CHLD} = 'IGNORE';を端末のどこか、スクリプトの一番上か、パッケージのどこかに置くのは、どこに置くべきかわかりません。再度ありがとう:-) – DomainsFeatured

+0

スクリプトの行4361を平行に変更します。 –

+0

MCVEを作ることができるかどうか確認してください。それはまだ非常に役に立つでしょう。 –

関連する問題