杀死评估过程

时间:2012-12-31 07:58:53

标签: bash eval kill

以此脚本为例,

#!/bin/sh

foo ()
{
  eval "$@"
}

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

在这个例子中,我想杀死tail,但是因为tail调用了eval,所以它不会被杀死。如果不诉诸tailpgrep等,我怎能杀死pkill

2 个答案:

答案 0 :(得分:1)

这是因为,当你kill $!,它实际上是子贝壳(foo&)时,会被SIGTERM杀死。你没有杀死tail命令。

如svnpenn所述,要么使用exec,要使子shell的PID由tail继承。

或使用下面的代码进行树遍历:

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

它将列出pid为$的所有尾部进程(-C tail)! (--ppid $!)&仅打印其PID -opid=&然后杀了那个pid。

答案 1 :(得分:0)

使用exec代替

#!/bin/sh

foo ()
{
  exec "$@"
}

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

如果使用管道,则需要进行流程替换

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

related