至少在GNU bash版本4.3.42 x86_64和&GNU bash版本4.3.11 x86_64上发生
我用sleep & wait $!
一个简单的方法而不是简单的方法sleep
来获得sleep
信号的可中断性(如SIGUSR1)。但是wait
当您运行以下命令时,bash-builtin的行为似乎很奇怪。
1号航站楼:
cat <(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
2号航站楼:
kill -10 /the pid of the subshell, printed by the previous command/
1号航站楼:
^C (ctrl + C)
然后,我得到了以100%消耗CPU的子外壳。
1号航站楼:
pkill -P $(pgrep -P $$)
您是否知道为什么会发生这种行为?
注意:cat <(/subshell/)
不在后台时,不会发生任何问题。
体验这种行为的另一种方式
1号航站楼:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)&
2号航站楼:
kill -10 /the pid of the subshell, printed by the previous command/
1号航站楼:
fg
^C (ctrl + C)
然后,获取冷冻的贝壳。
体验这种行为的第三种方式
1号航站楼:
(
trap 'echo SIGUSR1' SIGUSR1;
echo $BASHPID;
while :;do
sleep 1 &
wait $!;
echo test;
done
)
2号航站楼:
kill -10 /the pid of the subshell, printed by the previous command/
1号航站楼:
^C (ctrl + C)
然后,获取冷冻的贝壳。
要调试它,您可能必须从源代码构建Bash,并找出它在哪里循环(用调试器破坏它或添加打印语句)以及为什么循环。
—
哈兹
奇怪?我在这里无法重现此内容,我正在使用bash 4.3.42(1)-release(x86_64-pc-linux-gnu)。Debian 8.内核4.6.1-1。我完成了您说的所有测试,但CPU仍在正常运行...我所做的工作与您所说的完全相同,包括fg,然后按CTRL + C。
—
Luciano Andress Martini
我记得读过一些内容,这些内容与
—
phk
bash
4.4中的内置和信号更改有关,也许这可能会受到影响。
Bash 4.4.20修复了一个
—
Halfgaar
wait
看起来与此类似的自旋循环问题。我被循环中永远产生的子流程所打动。但是,我在4.4.20上测试了您的方案,但这仍然是一个问题。有趣的是,当我在构建的版本上附加调试器时,我可以看到它正在循环运行,但是它也具有中断它的作用,并且该循环将再次开始输出“测试”。换句话说:附加调试器使其停止自旋循环。