TERM陷阱无法可靠地杀死后台的睡眠过程

时间:2018-12-07 11:25:21

标签: bash signals kill-process gnu-coreutils

我写了一些BASH脚本来显示微调器,并注意到有时后台进程将完成并且杀死了微调器后,睡眠过程仍在运行并延迟了处理。我将代码简化为以下代码:

#!/bin/bash
trap 'rm deleteme.fifo' EXIT
mkfifo deleteme.fifo
echo we are $$

bar() {
    trap 'echo killing $sleep_pid from $$; kill $sleep_pid; wait $sleep_pid; echo exit subshell; exit' TERM
    sleep 20 &
    sleep_pid=$!
    echo sleep is $sleep_pid
    echo >deleteme.fifo
    echo before wait
    wait $sleep_pid
    echo after wait
}

foo() {
    bar &
    bar_pid=$!
    read <deleteme.fifo
    kill $bar_pid && echo waiting for subshell to terminate && wait $bar_pid; echo returning
}

while true; do
    foo &
    wait $!
done

bar中,我设置了陷阱并开始20秒钟的睡眠,然后通过命名管道通知父进程我们已经准备好。然后,我从foo处杀死了孩子。这通常是可行的,但有时睡眠可以保留下来,剩下的等待下来。这就是为什么我添加了循环以最终触发行为的原因。有人对此有解释吗?

bash 4.4.12(1),Linux 4.14.83,coreutils 8.29

0 个答案:

没有答案