Linux进程关闭和后台运行解析

进程的关闭,是通过信号进行传递的。我们通过kill命令发送不同的信号,去关闭指定的进程, 当我们关闭终端连接时,会向当前终端连接的下游进程发送SIGHUP信号(就是kill -1),触发进程关闭动作。

 

我们可以通过ps -fe|grep XXX查询进程信息。

 

[work ~]$ ps -fe|grep Test

work     31133 30981  0 20:09 pts/4    00:00:00 java Test

work     31277 23065  0 20:09 pts/1    00:00:00 grep --color Test

 

前三个分别对应 uid / pid(进程id) / ppid(父进程id),ppid其实就是当前终端连接的进程id。如果kill -9 ppid,当前终端连接就断了。

 

有时候我们执行一个命令,程序会在一直在运行,我们可以通过ctrl+c,发送的SIGINT信号(就是kill -2),中断程序。也可以通过ctrl+z,发送SIGTSTP信号,挂起进程,通过jobs命令查看,通过fg命令调起。

 

在linux中,通过命令行方式运行,属于交互模式。通过脚本方式运行属于非交互模式。 在非交互模式下,shell会对后台进程设置SIGINT信号忽略。

 

所以我们采用交互模式,也就是命令行方式运行java xxx &,后台运行一个进程(在当前的终端连接下后台运行),关闭终端连接时,进程会关闭。而通过shell脚本的方式,执行java xxx &命令,关闭连接时,java进程会把父进程id,切换挂在到init进程下(父进程id为1),也就是真正的后台运行了。

 

nohup命令会忽略SIGHUP信号,因此通过nohup java xxx &的方式运行,不论采用交互模式或者非交互模式运行,在终端连接关闭时,都会挂到init进程下。

 

Linux 技巧:让进程在后台可靠运行的几种方法》(http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/)文中提到了三种后台运行的命令 nohup/setsid/(xxx &),后两个命令可以直接把进程挂在init进程下,也可以通过disown命令把进程设置忽略SIGHUP信号

 

3.总结

在Linux中,通过信号,关闭进程,通过忽略信号,并把进程挂载到init进程下,保证进程可以后台运行。

本篇大部分结论也是参考《Tomcat进程意外退出的问题分析》(http://ifeve.com/why-kill-2-cannot-stop-tomcat/comment-page-1/?replytocom=7018)一文

 

 

  1. da shang
    donate-alipay
               donate-weixin weixinpay

发表评论↓↓