繁体   English   中英

杀死评估过程

[英]Kill eval'ed process

以此脚本为例

#!/bin/sh

foo ()
{
  eval "$@"
}

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

在此示例中,我想杀死tail ,但是因为eval的结果调用了tail ,所以它不会被杀死。 我如何不借助pgreppkill等杀死tail

这是因为,当您kill $! ,实际上是subshel​​l(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM