这章我们主要讲解一下Linux Signal(信号)。为什么要讲这个东东呢,因为在使用过程中会遇到问题,而且频率还是挺高的。比如说,你通过SSH
连接了Linux的终端,运行了一个软件或者启动一个web应用(Nginx、Java等等),当你满怀欣喜的把环境都搭建完毕,并且测试网页什么的都可以访问,这时候,你关闭了Linux的终端连接,此时,你会发现,各种访问不了的问题让你抓狂。然后,我们上网去找了下该问题的解决办法,一个nohup
命令进入了视线里,解决了问题,但是背后的原理你了解吗?下边就简单聊一聊这个东西。
Signal(信号)
我们可以通过输入命令 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 |
列表中 N) 代表的是信号编号
,后边是信号名称
,其中,32和33空缺,没有对应的信号
先大致说一下吧,1~31的信号为 UNIX 传统支持的信号,34~64是后来扩充的
传统信号(1~31)是不可靠信号
、非实时信号
、不支持排队
扩充信号(34~64)是可靠信号
、实时信号
、支持排队
不可靠信号
就是信号有可能丢失
实时信号
字面意思,Linux在处理信号的顺序上会优先实时信号
,并且是以编号从大到小处理,然后才是非实时信号
的处理
不支持排队
进程在处理不可靠信号的时候,如果出现多次相同信号,会做默认处理,不进行排队,直接丢弃信号,而可靠信号
则是进行排队等待处理
1) SIGHUP
本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。
登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也能继续下载。
此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。
名称解释:
进程组
一个或多个进程的集合,每一个进程组都有唯一一个进程组ID,即进程组
前台进程组
当前与终端交互的进程称为前台进程组. 其余进程组称为后台进程组.
Session
会话器,一个或多个进程组的集合,有唯一一个会话期首进程(session leader), 会话期ID为首进程的ID
控制进程
与控制终端连接的会话期首进程叫做控制进程
再看开头的问题,这回应该懂了吧.