子パイプラインプロセスの親プロセスを終了します。

子パイプラインプロセスの親プロセスを終了します。

私がやりたいことを示す小さなスクリプトがあります。

#!/bin/bash
> z
tail -f z | grep 'd' &
echo $!

$!grepプロセスのPIDを提供します。 grepプロセスと同時にtailプロセスを終了できるようにしたいです。これにより、kill "pid of grep"tailプロセスは終了しません。でもなくkillall grep。使ってもいいけどkillall tail危険だと思います。

ベストアンサー1

コマンドを括弧で囲みます。

( tail -f z | grep 'd' ) &
kill -- -$!

これにより、サブプロセス全体が終了します。

ここでは、終了する負のPIDを指定してプロセスグループ全体を終了します。バラよりman 1 kill

負のPID値は、プロセスグループ全体を選択するために使用できます。 psコマンド出力のPGID列を参照してください。

またはman 2 kill:

pidが-1未満の場合、IDが-pidのプロセスグループ内のすべてのプロセスにsigが送信されます。

しかし、kill -PIDそれだけで動作しますジョブ制御が有効な場合in bash(対話型シェルのデフォルト値)。そうしないと、子プロセスに専用のプロセスグループがなく、kill コマンドが失敗します。kill: (-PID) - No such process

この問題を解決するには、bash()set -mでジョブ制御を有効にするか、pkill -P $!

おすすめ記事