以下面的脚本为例
#!/bin/sh
foo ()
{
eval "$@"
}
touch bar
foo tail -f bar &
sleep 1
kill $!在本例中,我想终止tail,但是因为tail是作为eval的结果调用的,所以它不会被终止。我怎么才能在不求助于pgrep、pkill等的情况下杀死tail呢?
发布于 2012-12-31 17:14:18
改用exec应该行得通
#!/bin/sh
foo ()
{
exec "$@"
}
touch bar
foo tail -f bar &
sleep 1
kill $!如果使用管道,则需要进行进程替换
foo tail -f bar > >(tee baz) &发布于 2012-12-31 19:11:02
这是因为,当你使用kill $!时,实际上是子subshell (foo &),它被SIGTERM杀死了。您不能终止tail命令。
正如svnpenn所提到的,可以使用exec,以便tail继承subshell的PID。
或者使用下面的代码来遍历树:
kill `ps -C tail --ppid $! -opid=`它将列出pid为$!(--ppid $!)的所有尾部进程(-C tail),并仅打印其pid -opid=,然后终止该PID。
https://stackoverflow.com/questions/14099050
复制相似问题