私はループ内で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エラーを解決できますか?
このような経験をお持ちの場合は、洞察を深めることができます。
使用している並列バージョンは何ですか? – ccarton
GNU parallel 20160822(私が信じる最新のもの) – DomainsFeatured
これは並行してバグかもしれないと思います。私はコードを見ていて、作者はある時点でsigchldハンドラを削除しています。おそらく、シグナルを無視するのと同じ効果がある環境では、perlのドキュメントでは、ハンドラを "無視"に設定してシグナルを無視すると言われています。ハンドラを削除すると何が起こるかはわかりません。できる場合は、バージョン20150222に戻してみてください。 – ccarton