Linux中关于进程的几个概念
(1)进程组
进程组是一个或多个进程的集合,进程组方便了对多个进程的控制,在进程数较多的情况下,向进程组发送信号就行了。进程组ID是由它的组长进程的进程ID决定。组长进程创建了进程组,但它并不能决定进程组的存活时间,只要进程组内还有一个进程存在,进程组就存在,与组长进程是否已终止无关。
(2)会话
会话(session)是一个或多个进程组的集合,它开始于用户登陆终端,结束于用户退出登陆。其义如其名,就是指用户与系统的一次对话的全程。会话包括控制进程(与终端建立连接的领头进程),一个前台进程组和任意后台进程组。一个会话只能有一个控制终端,通常是登录到其上的终端设备或伪终端设备,产生在控制终端上的输入和信号将发送给会话的前台进程组中的所有进程。
(3)控制终端
每当我们使用终端工具打开一个本地或远程shell,我们便打开了一个控制终端。
备注:说白了,终端控制,就是我们登录Linux系统后得到的TTY,如物理终端机tty1-tty6、或伪终端机pts/n之类的。
如下为进程组与会话的关系:
终端机退出及进程存活问题
我们每次在终端窗口执行命令的时候,进程总会一直占用着终端,直到进程结束,这段时间内,我们在终端的输入是没有用的。而且,当终端窗口关闭或网络连接失败后,再次打开终端,会发现进程已经中断了。这是因为用户注销或者网络断开时,SIGHUP信号会被发送到会话所属的子进程,而此SIGHUP的默认处理方式是终止收到该信号的进程。所以若程序中没有捕捉该信号,当终端关闭后,会话所属进程就会退出。
在Linux中终端退出,仍能保证进程执行可以有如下几种方式:
(1)nohup
nohup是一个我们常用的命令了,它的作用如其字面意思,使进程不受SIGHUP信号的影响。但我们在使用nohup php test.php后会发现,进程还会一直占用前台终端,但即使终端被关闭或连接断开了,程序还是会执行,另外我们会发现在当前文件夹下多了个名为nohup.out的文件。这是因为nohup的功能仅仅是让进程不受SIGHUP信号的影响,并不会让出前台终端,而且它还会在命令执行目录下建立nohup.out用以存储进程的输出。如果进程不需要输出,且不想让nohup创建文件,可以将标准输出和标准错误输出重定向。 我们常将nohup和&搭配到一块使用,执行命令如下nohup command > /dev/null 2>&1 &
这样,就可以放心的等待进程运行结果了。
(2)setsid
setsid是另一个让进程在后台执行的命令,它的作用是让进程打开一个新的会话并运行进程,使用方式为setsid command
。根据上面的概念我们得知终端关闭后进程退出是因为会话首进程向进程发送了SIGHUP信号,setsid就厉害了,它直接打开一个新的会话来执行命令,那么原会话的终端的状态就再也不会影响到此进程了。
(3)一些终端复用工具
如screen,tmux等。