[英]Kill eval'ed process
以此脚本为例
#!/bin/sh
foo ()
{
eval "$@"
}
touch bar
foo tail -f bar &
sleep 1
kill $!
在此示例中,我想杀死tail
,但是因为eval
的结果调用了tail
,所以它不会被杀死。 我如何不借助pgrep
, pkill
等杀死tail
?
这是因为,当您kill $!
,实际上是subshell(foo&),被SIGTERM
杀死了。 您没有杀死tail
命令。
正如svnpenn提到的,无论是使用exec
使得子外壳的PID是由遗传tail
。
或使用以下代码进行树遍历:
kill `ps -C tail --ppid $! -opid=`
它将列出pid为$的所有尾进程( -C tail
)! ( --ppid $!
)&仅打印其PID -opid=
,然后杀死该pid。
使用exec
应该可以工作
#!/bin/sh
foo ()
{
exec "$@"
}
touch bar
foo tail -f bar &
sleep 1
kill $!
如果与管道一起使用,则需要进行过程替换
foo tail -f bar > >(tee baz) &
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.