1

単なる例として、このスクリプトを取り上げます

#!/bin/sh

foo ()
{
  eval "$@"
}

touch bar
foo tail -f bar &
sleep 1
kill $!

この例では を kill したいのですが、 は の結果として呼び出されたtailため、 kill されません。、などに頼らずにどうやって殺すことができますか?tailevaltailpgreppkill

4

2 に答える 2

1

exec代わりに使用するとうまくいくはずです

#!/bin/sh

foo ()
{
  exec "$@"
}

touch bar
foo tail -f bar &
sleep 1
kill $!

パイプで使用する場合は、プロセス置換を行う必要があります

foo tail -f bar > >(tee baz) &

関連している

于 2012-12-31T09:14:18.080 に答える
1

これはkill $!、実際にはサブシェル (foo &) であり、それが で殺されているためSIGTERMです。tailあなたはコマンドを殺していません。

svnpenn さんの言う通り、execサブシェルの PID を に引き継ぐように使うtail

または、ツリーのトラバースには以下のコードを使用します。

kill `ps -C tail --ppid $! -opid=`

pid-C tailが $! ( --ppid $!) & その PID のみを出力し、その-opid=pid を強制終了します。

于 2012-12-31T11:11:02.207 に答える