以此脚本为例,
#!/bin/sh
foo ()
{
eval "$@"
}
touch bar
foo tail -f bar &
sleep 1
kill $!
在这个例子中,我想杀死tail
,但是因为tail
调用了eval
,所以它不会被杀死。如果不诉诸tail
,pgrep
等,我怎能杀死pkill
?
答案 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) &