単なる例として、このスクリプトを取り上げます
#!/bin/sh
foo ()
{
eval "$@"
}
touch bar
foo tail -f bar &
sleep 1
kill $!
この例では を kill したいのですが、 は の結果として呼び出されたtail
ため、 kill されません。、などに頼らずにどうやって殺すことができますか?tail
eval
tail
pgrep
pkill
exec
代わりに使用するとうまくいくはずです
#!/bin/sh
foo ()
{
exec "$@"
}
touch bar
foo tail -f bar &
sleep 1
kill $!
パイプで使用する場合は、プロセス置換を行う必要があります
foo tail -f bar > >(tee baz) &
これはkill $!
、実際にはサブシェル (foo &) であり、それが で殺されているためSIGTERM
です。tail
あなたはコマンドを殺していません。
svnpenn さんの言う通り、exec
サブシェルの PID を に引き継ぐように使うtail
。
または、ツリーのトラバースには以下のコードを使用します。
kill `ps -C tail --ppid $! -opid=`
pid-C tail
が $! ( --ppid $!
) & その PID のみを出力し、その-opid=
pid を強制終了します。