4

script.sh をループで実行しています。スクリプトには、並列 wget コマンドが含まれています。次のエラーが表示されます。

Signal SIGCHLD received, but no signal handler set.

ループは次のようになります。

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

エラーの原因となっている行は次のようになります (オプションと設定を省略しています)。

cat file.txt | parallel -j15 wget

リサーチ:

私は GNU Parallel の専門家ではありませんが、上記のエラーが発生した場合を除いて、ほとんどの場合、スクリプトは問題なく動作しているようです。SIGCHLD を調べているうちに、並列実行を実行すると「ゾンビ プロセス」が作成される可能性があり、場合によってはこれらのプロセスを「刈り取る」必要があることがわかりました。また、プロセスが利用可能なすべての接続を占有する場合があるため、プロセスを強制終了できることもわかりました。

理解しようとしている:

ただし、そもそも何が問題を引き起こしているのかわかりません。それは私のパラレルですか?私はプロセスを「刈り取り」していませんか?プロセスを明示的に強制終了する必要がありますか? 並列スクリプトをループで実行しているためですか?

私の質問:

SIGCHLD エラーを解決するにはどうすればよいですか?

これについての経験があれば、あなたの洞察は大歓迎です。

4

2 に答える 2

1

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

于 2016-09-30T09:10:54.920 に答える
0

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

これまでのところ、バグを確実に再現できた人はいません。MCVE https://stackoverflow.com/help/mcveを作成できるかどうかを確認してください。IGNORE の提案で問題が解決する場合は、4361 行目を次のように変更する必要がありますparallel

    delete $SIG{CHLD};

の中へ:

    $SIG{CHLD} = 'IGNORE';

それが役に立ったかどうかをお知らせください。機能する場合は次のバージョンに入れることができます.

于 2016-09-29T06:35:47.390 に答える