最近在azure上搭一个基于web.py的web service,由于是用putty去ssh服务器,在server上把web.py启动以后,回到寝室由于PC睡眠,putty连接inactive,导致web service无法正常访问。
正常启动web service:
python test.py 8888
其中8888是端口号
为了即使关掉当前的ssh连接,同时避免网络出现异常导致ssh断开连接,需要想办法关掉putty以后也能让进程继续在后台运行。
关闭putty的时候,也会关闭该进程的所有子进程。于是又2个思路:
1. 让web service的进程忽略关闭信号
nohup python test.py 8888 2>webpy.log
即让该进程忽略hangup信号,同时将log记录下来。
于是我们通过ps -ef查看进程信息,在ssh连接还在的时候,该web service的进程的父进程是ssh,如图:
ssh关闭以后,再看该web service的父进程变成了1,即init的进程id
2. 让web service不是ssh的子进程
setsid python test.py 8888 2>webpy.log
更直接,看setsid的manual,有:“setsid runs a program in a new session.”
查看进程信息发现该进程的父进程是1,即init的进程id,既然该进程与当前的ssh连接没关系,那就关闭ssh也没关系啦~
关闭ssh以后,ps -ef如下图:
哦了~
通过这两种方法就可以避免ssh连接断开后子进程也关闭的情况了,但是这样的话最好把log记录下来
再加一种方法:
subshell:
(python test.py 8888 2>webpy.log &)
注意括号不能少
这样得到的该web service的进程的父进程id也是1,因此也能后台运行。
最后一种方法:screen,也可以实现后台运行,其原理如下:参考自http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/
未使用screen的进程树:
[root@pvcent107 ~]# ping www.google.com & [1] 9499 [root@pvcent107 ~]# pstree -H 9499 init─┬─Xvnc ├─acpid ├─atd ├─2*[sendmail] ├─sshd─┬─sshd───bash───pstree │ └─sshd───bash───pingbash是sshd的子进程,所以sshd关闭以后,子进程也关闭
使用screen的进程树:
[root@pvcent107 ~]# screen -r Urumchi
[root@pvcent107 ~]# ping www.ibm.com &
[1] 9488
[root@pvcent107 ~]# pstree -H 9488
init─┬─Xvnc
├─acpid
├─atd
├─screen───bash───ping
├─2*[sendmail]
bash是screen的子进程,而screen是init的子进程,因此关掉sshd与该bash没有关系
由于screen强大的功能远不止此,还可以为我们后续的功能所用,因此下一篇blog会着重介绍screen