単なる例として、このスクリプトを取り上げます
#!/bin/sh
foo ()
{
eval "$@"
}
touch bar
foo tail -f bar &
sleep 1
kill $!
この例では を kill したいのですが、 は の結果として呼び出されたtailため、 kill されません。、などに頼らずにどうやって殺すことができますか?tailevaltailpgreppkill
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 を強制終了します。