bash - 终端关闭时 bash 收到的信号

标签 bash terminal signals

使用 trap 捕获这样的信号:

i=-1;while((++i<33));
do
    trap "echo $i >> log.txt" $i;
done

并强制关闭终端。

那么log.txt中的内容是(redhat linux下):

1

18

1

17

0

这些信号来自哪里?

最佳答案

第一个信号是SIGHUP;当终端断开连接(挂断 - 因此 HUP)时,它被发送到进程组中的所有进程。

第二个信号是 SIGCONT(感谢 SiegeX 提供的数字)。这有点令人惊讶;它表明您在后台停止了一项作业,必须允许它再次运行。

第三个信号是另一个 SIGHUP。这可能是为了确保继续的流程轮到退出而发送的,但它被发送给了整个流程组。 (有关进程组等信息,请参见 POSIX 标准)。

第四个信号是 SIGCHLD,表示一个子进程已死亡,尸体可用(嗯,状态可用)。

最后一个信号 0 是 shell 内部伪信号,表明它正在退出。

你可以这样做:

trap 'echo Bye' 0

当 shell 出于任何原因在控制下退出时回显“再见”。您选择将信号编号回显到文件中。由于此时 shell 退出,这是看到的最后一条信号消息。它的父进程应该得到一个 SIGCHLD 信号,因为 shell 已经死了。


FWIW,在 MacOS X 10.6.7 上,我运行了你的测试。 MacOS X 上没有 signal 32,部分映射不同,信号发送顺序也不同:

$ i=-1;while((++i<33));
> do
>     trap "echo $i >> log.txt" $i;
> done
-sh: trap: 32: invalid signal specification
$ trap
trap -- 'echo 0 >> log.txt' EXIT
trap -- 'echo 1 >> log.txt' HUP
trap -- 'echo 2 >> log.txt' INT
trap -- 'echo 3 >> log.txt' QUIT
trap -- 'echo 4 >> log.txt' ILL
trap -- 'echo 5 >> log.txt' TRAP
trap -- 'echo 6 >> log.txt' ABRT
trap -- 'echo 7 >> log.txt' EMT
trap -- 'echo 8 >> log.txt' FPE
trap -- 'echo 9 >> log.txt' KILL
trap -- 'echo 10 >> log.txt' BUS
trap -- 'echo 11 >> log.txt' SEGV
trap -- 'echo 12 >> log.txt' SYS
trap -- 'echo 13 >> log.txt' PIPE
trap -- 'echo 14 >> log.txt' ALRM
trap -- 'echo 15 >> log.txt' TERM
trap -- 'echo 16 >> log.txt' URG
trap -- 'echo 17 >> log.txt' STOP
trap -- 'echo 19 >> log.txt' CONT
trap -- 'echo 20 >> log.txt' CHLD
trap -- 'echo 23 >> log.txt' IO
trap -- 'echo 24 >> log.txt' XCPU
trap -- 'echo 25 >> log.txt' XFSZ
trap -- 'echo 26 >> log.txt' VTALRM
trap -- 'echo 27 >> log.txt' PROF
trap -- 'echo 28 >> log.txt' WINCH
trap -- 'echo 29 >> log.txt' INFO
trap -- 'echo 30 >> log.txt' USR1
trap -- 'echo 31 >> log.txt' USR2
$

在一次运行中捕获的信号是:

2
1
20
0

在第二次运行中,我得到:

20
1
20
0

SIGINT 首先令人惊讶——我认为我无法解释,除非它只是意味着某种不完整的写入(它应该读取 20,但 SIGHUP 导致了问题)。我也不确定我能否解释 SIGCHLD 信号; SIGHUP 和 'exit' 陷阱和以前一样。

不过,在某种程度上,信号是特定于系统的——至少看起来是这样。不过,SIGHUP 是常见且不变的。

关于bash - 终端关闭时 bash 收到的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5546223/

相关文章:

bash - 如何使用 bash 脚本拆分包含多条记录的行

java - 如何查看页面输出的java错误?

linux - 如何在 Linux 终端上隐藏主机名?

linux - 进程什么时候处理信号

bash - bash 是一种编程语言吗?

用于配置 grep 输出的 Perl 脚本

unix - UNIX进程如何忽略系统信号?

c++ - 为什么不能从信号处理程序调用 dlclose()?

linux - 如何在 bash 中同步处理 2 个范围/列表

linux - 递归地将Linux命令应用于单一(.sh)类型目录中的所有文件