终端关闭时bash收到的信号

fir*_*ks2 11 bash terminal signals

使用陷阱来捕获这样的信号:

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

并用力关闭终端.

然后log.txt中的内容(在redhat linux下):

1

18

1

17

0

这些信号来自哪里?

Jon*_*ler 12

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

第二个信号是SIGCONT(谢谢,SiegeX,数字).这有点令人惊讶; 它表明你在背景中停止了一项必须允许再次运行的工作.

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

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

最终信号0是壳内部伪信号,表示它正在退出.

你可以做:

trap 'echo Bye' 0
Run Code Online (Sandbox Code Playgroud)

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


FWIW,在MacOS X 10.6.7上,我运行了你的测试.MacOS X上没有信号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
$
Run Code Online (Sandbox Code Playgroud)

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

2
1
20
0
Run Code Online (Sandbox Code Playgroud)

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

20
1
20
0
Run Code Online (Sandbox Code Playgroud)

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

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


Sie*_*geX 5

如果您询问每个信号是什么,请使用 kill -l

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
Run Code Online (Sandbox Code Playgroud)

请注意,kill -0 <PID>除了返回退出代码以指示是否可以将信号发送到PID之外,a 什么都不做