我试图在 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 -$!