终端关闭时bash收到的信号

前端之家收集整理的这篇文章主要介绍了终端关闭时bash收到的信号前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用陷阱来捕获这样的信号:
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是壳内部伪信号,表示它正在退出.

你可以做:

trap 'echo Bye' 0

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

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

2
1
20
0

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

20
1
20
0

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

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

猜你在找的Bash相关文章