杀死在函数内启动的作业

杀死在函数内启动的作业

我试图在 bash 脚本中使用一些函数来简化调用一些子进程。我想在调用站点决定是否将进程作为作业在后台运行,或者在前台运行,然后在必要时终止子进程。不幸的是,据我所知,我得到的 pid$!不属于长时间运行的后台进程,而是调用它的函数。杀死我用 $! 得到的 pid!不会杀死长时间运行的子进程,并且它似乎被孤立了。

function inner() {
  tail -f /dev/null
}

function outer() {
  inner
}

outer &
echo 'Before, $!: ' $!
echo 'Before, jobs -p: ' $(jobs -p)
echo 'Before, ps aux: ' $(ps aux | grep /dev/null | grep -v grep)

kill $!
echo 'After, $!: ' $!
echo 'After, jobs -p: ' $(jobs -p)
echo 'After, ps aux: ' $(ps aux | grep /dev/null | grep -v grep)

我得到的输出是:

Before, $!:  71644
Before, jobs -p:  71644
Before, ps aux:  jstaab 71646 0.0 0.0 4267744 688 s005 S+ 2:53PM 0:00.00 tail -f /dev/null
After, $!:  71644
After, jobs -p:  71644
./test.sh: line 17: 71644 Terminated: 15          outer
After, ps aux:  jstaab 71646 0.4 0.0 4267744 688 s005 S+ 2:53PM 0:00.00 tail -f /dev/null

您会注意到这ps aux给了我一个与$!或不同的 pid jobs -p。这是有道理的,但是我怎样才能tail -f /dev/null用 a杀死kill而不需要 grep 命令呢?

答案1

outer &创建一个子shell。$!给出该子 shell 的 PID。

tail -f /dev/null是该子 shell 的子级,因此它具有不同的 PID。但你可以做

exec tail -f /dev/null

反而。然后kill点击tail

另一种可能性是使用/bin/kill内置的 shell 来代替。使用负数作为参数,您可以杀死整个进程组:

/bin/kill -TERM -$!

相关内容