我可以写脚本,陷阱 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)并没有什么,除了印刷 ^\ 在终端。为什么?

我有两个运行理论。第一个是语义 SIGINTSIGQUIT 是不同的,这样的 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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top