终端关闭时bash收到的信号

前端之家收集整理的这篇文章主要介绍了终端关闭时bash收到的信号前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用陷阱来捕获这样的信号:
  1. i=-1;while((++i<33));
  2. do
  3. trap "echo $i >> log.txt" $i;
  4. done

并用力关闭终端.

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

1

18

1

17

0

这些信号来自哪里?

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

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

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

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

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

你可以做:

  1. trap 'echo Bye' 0

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

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

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

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

  1. 2
  2. 1
  3. 20
  4. 0

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

  1. 20
  2. 1
  3. 20
  4. 0

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

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

猜你在找的Bash相关文章