Max*_*y-B 5 unix bash signals exit bash-trap
我可以编写可以很好地捕获的 shell 脚本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
Run Code Online (Sandbox Code Playgroud)
执行此脚本并按下CTRL-C具有所需的效果,但是按下CTRL-\(据我所知,应该触发)除了在终端中SIGQUIT打印之外没有任何作用。^\为什么?
我有两个运行理论。首先,SIGINT和 的语义SIGQUIT不同,SIGQUIT仅发送到子进程sleep,而同时SIGINT发送到子进程和父 bash 进程。如果是这种情况,它在哪里记录?
我的第二个理论是 bash 不仅默认忽略(即有一个无操作处理程序)SIGQUIT(如手册页所示),而且根本不允许它被捕获。该理论与第一个理论重叠,因为父级和子级都可能出现这种情况SIGQUIT,但父级 ( bash) 无法捕获它。如果是这种情况,有什么方法可以捕获SIGQUITbash 脚本吗?...也许shopt我可以设置一些?
编辑:这是在 Ubuntu 10.10 上的 gnome-terminal 2.32.0 上运行 bash 4.1.5,并且 yes^\被配置为发出 SIGQUIT (由向其他程序(如 )发出 SIGQUIT报告stty -a并确认)。^\ping
更新:我刚刚发现问题一定是由于 gnome-terminal 造成的。如果我从虚拟控制台运行这个脚本(即ctrl-alt-f1退出 X),当我按下 时,它会完美地捕获 SIGQUIT ^\。bash 和一切都一样,所以唯一的区别一定是终端模拟器。所以现在我的问题是:如何配置 gnome-terminal 在这方面表现得像虚拟控制台?我在虚拟控制台和 gnome 终端中diff查看了输出stty -a,虽然存在差异,但似乎没有什么直接相关的(例如,它们都有quit = ^\;)。
更新2:另一个实验。$ sleep 60只需在 gnome-terminal 中执行即可;按下按钮^\,信号未被捕获。$ sleep 60现在在虚拟控制台中执行;按下并捕获^\信号——进程打印并退出。但现在在 gnome-terminal 中运行并按下- 信号被捕获并按预期进行处理。因此,gnome-terminal 有一些奇怪的地方,即 SIGQUIT 可以被某些程序捕获,但不能被其他程序捕获,即使其他程序在从虚拟控制台调用时确实捕获了它。也许我应该升级我的 gnome 终端。Quit$ ping google.com^\
我只能假设这是 gnome-terminal 2.32.0 中的某种错误;我已经升级到 Ubuntu 11.04,使用 gnome-terminal 2.32.1(和 bash 4.2.8),并且 SIGQUIT 现在按预期被捕获。
| 归档时间: |
|
| 查看次数: |
5726 次 |
| 最近记录: |