说明
我们经常使用kill命令杀死进程,其实默认kill命令是向进程发送了一个SIGTERM信号让进程优雅地退出的,那么其他常用Linux中的信号有哪些呢,具体解析如下
常用信号
信号名 | 信号含义 |
---|---|
SIGHUP(连接断开) | 是终端断开信号,如果终端接口检测到一个连接断开,发送此信号到该终端所在的会话首进程,缺省动作会导致所有相关进程退出,kill -1 进程号 也能发送此信号给进程 |
SIGALAM(定时器超时) | 一般调用系统函数alarm创建定时器 ,定时器超时了就会有这个信号 |
SIGINT(中断) | 从键盘上输入ctrl + c (中断键), 比如你进程正跑着循环干一个事,这一ctrl + c 就能打断你干的事,终止进程;但是shell会将后台进程对该信号的处理设置为忽略(也就是说该进程若在后台运行则不会收到该信号) |
SIGSEGV(无效内存) | 内存访问异常,除数为0等,硬件会检测到并通知内核;其实这个SEGV代表段违例(segmentation violation),你有的时候运行一个你编译出来的可执行的c程序,如果内存有问题,执行的时候会出现这个提示 |
SIGIO(异步IO) | 通用异步I/O信号,如果通讯套接口上有数据到达,或发生一些异步错误,内核就会通知我们这个信号 |
SIGCHLD(子进程改变) | 一个进程终止或者停止时,这个信号会被发送给父进程(我们想象下nginx,worker进程终止时,master进程应该会收到内核发出的针对该信号的通知) |
SIGUSR1,SIGUSR2(都是用户定义信号) | 用户定义的信号,可用于应用程序 |
SIGTERM(终止) | 一般你通过在命令行上输入kill 命令来杀死一个进程的时候就会触发这个信号,收到这个信号后,你有机会进行一些退出前的处理,实现所谓的优雅退出的效果 |
SIGKILL(终止) | 不能被忽略,这是杀死任意进程的可靠方法,不能被进程本身捕捉 |
SIGSTOP (停止) | 不能被忽略,使进程停止运行,可以使用SIGCONT继续运行,但进程会被放入后台 |
SIGQUIT(终端退出符) | 从键盘按ctrl + \ , 但shell会将后台进程对该信号的处理设置为忽略(也就是说该进程若在后台运行则不会收到该信号) |
SIGCONT(使暂停进程继续) | 使暂停的进程继续运行 |
SIGTSTP (终端停止符) | 从键盘按ctrl + z ,进程被停止,并被放入后台,可以用SIGCONT继续运行 |