设为首页 加入收藏

TOP

Python脚本后台运行
2015-08-31 21:24:47 来源: 作者: 【 】 浏览:49
Tags:Python 脚本 后台 运行

问题描述:


一个用Python写的监控脚本test1.py,用while True方式一直运行,在ssh远程(使用putty终端)时通过以下命令启动脚本:


python test1.py &


现在脚本正常运行,通过ps能看到进程号,此时直接关闭ssh终端(不是用exit命令,是直接通过putty的关闭按钮执行的), 再次登录后发现进程已经退出了。


通过后台启动的方式该问题已经解决,这里总结下,也方便我以后查阅。


Linux 下后台运行


通过fork实现


Linux环境下,在c中守护进程是通过fork方式实现的,python也可以通过该方式实现,示例代码如下:


#!/usr/bin/env python
#E-Mail : Mike_Zhang@live.com
import time,platform
import os


def funzioneDemo():
? ? # 这是具体业务函数示例
? ? fout = open('/tmp/demone.log', 'w')
? ? while True:
? ? ? ? fout.write(time.ctime()+'\n')
? ? ? ? fout.flush()
? ? ? ? time.sleep(2)
? ? fout.close()


def createDaemon():
? ? # fork进程? ? ? ?
? ? try:
? ? ? ? if os.fork() > 0: os._exit(0)
? ? except OSError, error:
? ? ? ? print 'fork #1 failed: %d (%s)' % (error.errno, error.strerror)
? ? ? ? os._exit(1)? ?
? ? os.chdir('/')
? ? os.setsid()
? ? os.umask(0)
? ? try:
? ? ? ? pid = os.fork()
? ? ? ? if pid > 0:
? ? ? ? ? ? print 'Daemon PID %d' % pid
? ? ? ? ? ? os._exit(0)
? ? except OSError, error:
? ? ? ? print 'fork #2 failed: %d (%s)' % (error.errno, error.strerror)
? ? ? ? os._exit(1)
? ? # 重定向标准IO
? ? sys.stdout.flush()
? ? sys.stderr.flush()
? ? si = file("/dev/null", 'r')
? ? so = file("/dev/null", 'a+')
? ? se = file("/dev/null", 'a+', 0)
? ? os.dup2(si.fileno(), sys.stdin.fileno())
? ? os.dup2(so.fileno(), sys.stdout.fileno())
? ? os.dup2(se.fileno(), sys.stderr.fileno())


? ? # 在子进程中执行代码
? ? funzioneDemo() # function demo


if __name__ == '__main__':
? ? if platform.system() == "Linux":
? ? ? ? createDaemon()
? ? else:
? ? ? ? os._exit(0)


通过upstart方式实现


可以通过upstart把应用封装成系统服务,这里直接记录下完整示例。


1、编写python脚本
[root@local t27]# cat test123.py
#!/usr/bin/env python


import os,time


while True :
? ? print time.time()
? ? time.sleep(1)


2、编写upstat配置文件
[root@local t27]# cat /etc/init/mikeTest.conf
description "My test"
author "Mike_Zhang@live.com"


start on runlevel [234]
stop on runlevel [0156]


chdir /test/t27
exec /test/t27/test123.py
respawn


3、重新加载upstate
initctl reload-configuration


4、启动服务
[root@local t27]# start mikeTest
mikeTest start/running, process 6635
[root@local t27]# ps aux | grep test123.py
root? ? ? 6635? 0.0? 0.0? 22448? 3716 ?? ? ? ? Ss? 09:55? 0:00 python /test/t27/test123.py
root? ? ? 6677? 0.0? 0.0 103212? 752 pts/1? ? S+? 09:56? 0:00 grep test123.py


5、停止服务
[root@local t27]# stop mikeTest
mikeTest stop/waiting
[root@local t27]# ps aux | grep test123.py
root? ? ? 6696? 0.0? 0.0 103212? 752 pts/1? ? S+? 09:56? 0:00 grep test123.py
[root@local t27]#


通过bash脚本实现


1、python代码
[root@local test]# cat test123.py
#!/usr/bin/env python


import os,time


while True :
? ? print time.time()
? ? time.sleep(1)


2、编写启动脚本
[root@local test]# cat start.sh
#! /bin/sh


python test123.py &


3、启动进程
[root@local test]#./start.sh


如果直接用&启动进程:
python test123.py &


直接关闭ssh终端会导致进程退出。


通过screen、tmux等方式实现


如果临时跑程序的话,可以通过screen、tmux启动程序,这里描述下tmux启动的方式。


1、启动tmux
在终端输入tmux即可启动


2、在tmux中启动程序


直接执行如下命令即可(脚本参考上面的): python test123.py


3、直接关闭ssh终端(比如putty上的关闭按钮);


4、重新ssh上去之后,执行如下命令:
tmux attach


现在可以看到python程序还在正常执行。


Windows下后台运行
在Windows下没有深入的研究过,我经常用的方法是修改python脚本的扩展名为".pyw",双击即可后台运行,不需要修改任何代码。


下面关于Python的文章您也可能喜欢,不妨看看:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇使用C/C++扩展Python 下一篇基于Python:OpenCV简单图片操作

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: