5

私はこのようなシミュレーションを実行しています

./waf --run scratch/myfile | awk -f filter.awk 

何かが起こったことwafを検出したらすぐに(たとえば、特定の行が読み取られた後)コマンドを強制終了するにはどうすればよいですか?filter.awk

変更できませwafmyfile。変更できるfilter.awkのは、上記のコマンドだけです(明らかに)。

コメント後に更新:

  • waf受信後に終了しませんSIGPIPE(そうあるべきですか?)
  • クリーンアップが必要な子プロセスを生成します。

これは私自身の答え (そして挑戦)です。


@thatotherguyの答えと@Chrisの答えに取り組んだ後、私は少し単純化してこれを手に入れました:

tmp=$(mktemp)
{ ./waf --run scratch/myfile & echo $! > "$tmp"; } | { awk -f filter.awk; pkill -P $(<$tmp); kill $(<$tmp); }

残念ながら、ファイルを削除できませんでした。変数としてtmpを渡す試みはすべて失敗しました。PID

受け入れられた答えは変更しませんが(本当に必要なときに機能したので)、もっと単純化できる人には+1します。

4

3 に答える 3

4

awkexitステートメントを使用します。wafそれを接続しているパイプが閉じるとすぐに終了する必要がありawkます。

于 2013-02-15T16:50:22.587 に答える
2

これをトリッキーにしているwafのは、パイプが壊れたときに終了しないことによって誤動作し、それは私たちも取り除く必要がある2番目のプロセスを生み出します:

tmp=$(mktemp)
cat <(./waf --run scratch/myfile & echo $! > "$tmp"; wait) | awk -f filter.awk; 
pkill -P $(<$tmp)
kill $(<$tmp)
  • <(process substitution)バックグラウンドで実行wafし、そのpidを一時ファイルに書き込むために使用します。
  • パイプが壊れたときに適切に終了し、パイプラインを終了できるため、catこのプロセスからawkにデータを中継するための仲介者として使用します。cat
  • wafパイプラインが完了すると、 (親PIDによって)生成されたすべてのプロセスを強制終了します
  • 最後に私たちは自殺wafします。
于 2013-02-15T19:12:33.667 に答える
1

awk終了すると、次に出力を書き込もうとしたときにwaf取得します。これにより、意図的に作成した人が終了するように指示することを無視するように設定しない限り、出力が終了します。この場合、手動で強制終了する必要があります。 。何かのようなもの:SIGPIPEwafSIGPIPEkill

./waf --run scratch/myfile | ( awk -f filter.awk; killall waf )

がすべての終了シグナルを無視する場合の-KILLオプションが必要になる場合があります。killallwaf

于 2013-02-15T17:15:08.033 に答える