终端关闭时bash接收到的信号 [英] Signals received by bash when terminal is closed

查看:28
本文介绍了终端关闭时bash接收到的信号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用trap来捕获这样的信号:

Use trap to capture signals like this:

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

并强制关闭终端.

log.txt里面的内容就是(redhat linux下):

The content in log.txt is then (under redhat linux):

1

18

1

17

0

这些信号来自哪里?

推荐答案

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

The first signal is SIGHUP; that gets sent to all processes in the process group when the terminal disconnects (hangs up - hence HUP).

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

The second signal is SIGCONT (thanks, SiegeX, for the numbers). This is slightly surprising; it suggests you had a job stopped in the background which had to be allowed to run again.

第三个信号是另一个 SIGHUP.这可能被发送以确保继续的进程轮到退出,但被发送到整个进程组.(有关进程组等的信息,请参阅 POSIX 标准).

The third signal is another SIGHUP. This was likely sent to ensure that the continued process got its turn to exit, but was sent to the whole process group. (See the POSIX standard for information on process groups, etc.).

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

The fourth signals is a SIGCHLD, indicating that a child process died and the corpse is available (well, the status is available).

最后的信号 0 是 shell 内部伪信号,表明它正在退出.

The final signal, 0, is the shells internal pseudo-signal indicating that it is exiting.

你可以这样做:

trap 'echo Bye' 0

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

to echo 'Bye' when the shell exits under control for any reason. You chose to echo the signal number to the file instead. Since the shell exits at this point, that is the last signal message that is seen. Its parent process should get a SIGCHLD signal because the shell died.

FWIW,在 MacOS X 10.6.7 上,我运行了您的测试.MacOS X上没有信号32,有些映射不同,发送信号的顺序也不同:

FWIW, on MacOS X 10.6.7, I ran your test. There isn't a signal 32 on MacOS X, and some of the mappings are different, and the sequence of signals sent is also different:

$ 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
$

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

The signals captured in one run were:

2
1
20
0

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

In a second run, I got:

20
1
20
0

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

The SIGINT first is surprising -- I don't think I can explain that unless it simply means an incomplete write of some sort (it should have read 20 but the SIGHUP caused a problem). I'm not sure that I can explain the SIGCHLD signals either; the SIGHUP and 'exit' trap are as before.

不过,在某种程度上,信号是系统特定的 - 或者看起来如此.不过,SIGHUP 是常见且恒定的.

To some extent, though, the signals are system specific - or so it seems. The SIGHUP is common and constant, though.

这篇关于终端关闭时bash接收到的信号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆