我怎么陷阱SIGQUIT正确地在砸剧本吗?
题
我可以写脚本,陷阱 SIGINT
不错,但我不能似乎陷阱 SIGQUIT
.
#!/bin/bash
function die {
echo "Dying on signal $1"
exit 0
}
trap 'die "SIGINT"' SIGINT
trap 'die "SIGQUIT"' SIGQUIT
while true; do
echo "sleeping..."
sleep 5
done
执行这个脚本和紧迫 CTRL-C
有希望的效果,但按 CTRL-\
(其中,因为我理解,都应触发 SIGQUIT
)并没有什么,除了印刷 ^\
在终端。为什么?
我有两个运行理论。第一个是语义 SIGINT
和 SIGQUIT
是不同的,这样的 SIGQUIT
只有得到发送给孩子的过程 sleep
, 同时 SIGINT
被送到这两个孩子的过程和父母庆典的过程。如果是这种情况,哪里有记录?
我的第二个理论是,bash不仅忽略(即,有没有作的处理程序) SIGQUIT
默认情况下(如人页建议),但不允许它被困在所有。这一理论重叠的第一个理论,因为它可能的情况, SIGQUIT
去父母和儿童,但在父母(bash
)就是不可能的陷阱。如果是这种情况下,是否有 任何 方法的陷阱 SIGQUIT
在庆典剧本吗...也许一些 shopt
我可以吗?
编辑:这是在Ubuntu10.10在侏儒端2.32.0运行bash4.1.5,是的 ^\
配置问题SIGQUIT(如报告的通过 stty -a
并确认了通过发布 ^\
SIGQUITs到的其他程序喜欢 ping
).
更新:我只是发现问题必须由以某种方式来侏儒-终端。如果我经营这个脚本来自一个虚拟的控制台(即, ctrl-alt-f1
得出的X),它陷阱SIGQUIT完全没当我按下 ^\
.同样的庆典和一切,所以唯一的区别必须终端模拟器。所以现在我的问题就变成:我怎么能配置的侏儒端表现得喜欢的虚拟控制台在这方面?我 diff
'd的产出 stty -a
在虚拟控制台和侏儒端,同时有差异,似乎没有任何立即的相关(例如,他们两个都有 quit = ^\;
).
更新2:另一个实验。只需执行 $ sleep 60
在侏儒-终端;按 ^\
和信号去未捕获。现在,执行 $ sleep 60
在虚拟控制台;按 ^\
和信号 是 抓住--的过程中印 Quit
然后退出。但是,现在运行 $ ping google.com
在侏儒端和新闻 ^\
--信号是捕获和处理预期的作用。所以有一些奇怪的关于侏儒的终端使SIGQUIT能够陷入由一些程序,但不是由他人,即使这些其他人 做 抓住它,当援引自虚拟机。也许我应该刚刚升级了我的侏儒-终端。
解决方案
我只能假设这是一种错误的侏儒端2.32.0;因为我已经升级为Ubuntu的11.04,侏儒端2.32.1(和bash4.2.8)和SIGQUIT是现在被困作为预期。
其他提示
我观察到同样的行为在Fedora19系:根据 ps s
, ,bash在xfce4端有SIGQUIT忽略,运行 yes >/dev/null &
然后 ps s
表明,即使子流程具有SIGQUIT忽略。当我(来自同一终端)的运行 ssh localhost
, 壳在ssh届会议的还有SIGQUIT忽视,但是 yes >/dev/null &
没有。
鉴于上述评论,其中提到的侏儒端,我会猜到的错误是在共同部分的两个终端:的 vte
图书馆。我是 vte-0.28.2-9.fc19.x86_64
.