使用Linux之前需要了解的(二)

小小码农 2021年07月30日 873次浏览

这章我们主要讲解一下Linux Signal(信号)。为什么要讲这个东东呢,因为在使用过程中会遇到问题,而且频率还是挺高的。比如说,你通过SSH连接了Linux的终端,运行了一个软件或者启动一个web应用(Nginx、Java等等),当你满怀欣喜的把环境都搭建完毕,并且测试网页什么的都可以访问,这时候,你关闭了Linux的终端连接,此时,你会发现,各种访问不了的问题让你抓狂。然后,我们上网去找了下该问题的解决办法,一个nohup命令进入了视线里,解决了问题,但是背后的原理你了解吗?下边就简单聊一聊这个东西。

Signal(信号)

我们可以通过输入命令 kill -l 来显示信号列表信息,如下:

1) SIGHUP2) SIGINT3) SIGQUIT4) SIGILL5) SIGTRAP
6) SIGABRT7) SIGBUS8) SIGFPE9) SIGKILL10) SIGUSR1
11) SIGSEGV12) SIGUSR213) SIGPIPE14) SIGALRM15) SIGTERM
16) SIGSTKFLT17) SIGCHLD18) SIGCONT19) SIGSTOP20) SIGTSTP
21) SIGTTIN22) SIGTTOU23) SIGURG24) SIGXCPU25) SIGXFSZ
26) SIGVTALRM27) SIGPROF28) SIGWINCH29) SIGIO30) SIGPWR
31) SIGSYS34) SIGRTMIN35) SIGRTMIN+136) SIGRTMIN+237) SIGRTMIN+3
38) SIGRTMIN+439) SIGRTMIN+540) SIGRTMIN+641) SIGRTMIN+742) SIGRTMIN+8
43) SIGRTMIN+944) SIGRTMIN+1045) SIGRTMIN+1146) SIGRTMIN+1247) SIGRTMIN+13
48) SIGRTMIN+1449) SIGRTMIN+1550) SIGRTMAX-1451) SIGRTMAX-1352) SIGRTMAX-12
53) SIGRTMAX-1154) SIGRTMAX-1055) SIGRTMAX-956) SIGRTMAX-857) SIGRTMAX-7
58) SIGRTMAX-659) SIGRTMAX-560) SIGRTMAX-461) SIGRTMAX-362) SIGRTMAX-2
63) SIGRTMAX-164) 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
控制进程 与控制终端连接的会话期首进程叫做控制进程

再看开头的问题,这回应该懂了吧.