ubuntu后台运行进程

最近在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───ping
bash是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值