1. 问题分析:
ssh打开终端,执行耗时行为(编译大项目),网络不稳定,需要断开ssh, 关闭ssh终端,最终导致编译终止。
一个shell 为一个会话,一个会话包含多个进程组,一个进程组包含多个进程。
当控制进程失去shell终端时,内核回向其发送SIGHUP信号。
shell收到SIGHUP信号时,会向其创建的前后台进程组发送SIGHUP信号,各个进程收到SIGHUP信号,默认终止任务。
2. 解决方法
2.1 setsid command
setsid 开启新会话,完全不属于shell的会话,故其父进程进程不属于shell了,不会接受shell退出的SIGHUP信号。
实例:
jony@ubuntu:~$ setsid sleep 300 & [1] 9678
关闭当前终端,查看进程是否存在:
jony@ubuntu:~$ ps -p 9678 -o cmd,pid,ppid,pgid,sid,etime CMD PID PPID PGID SID ELAPSED sleep 300 9678 1380 9678 9678 01:48
shell 进程 9670:
可以发现 采用sesid的进程的父进程不为shell进程,故程序不受shell退出发送的SIGHUP信号影响。
2.2 nohup command
进程不受SIGHUP信号的影响。
2.3 进程已启动,亡羊补牢
使用 disown 使进程不接收SIGHUP信号。
jony@ubuntu:~$ sleep 300 & [1] 9702 jony@ubuntu:~$ jobs -l [1]+ 9702 Running sleep 300 & jony@ubuntu:~$ disown %1 jony@ubuntu:~$ jobs - bash: jobs: -: no such job jony@ubuntu:~$ exit



