Python脚本后台运行的几种方式
一个用python写的监控脚本test1.py,用whileTrue方式一直运行,在ssh远程(使用putty终端)时通过以下命令启动脚本:
pythontest1.py&
现在脚本正常运行,通过ps能看到进程号,此时直接关闭ssh终端(不是用exit命令,是直接通过putty的关闭按钮执行的),再次登录后发现进程已经退出了。
通过后台启动的方式该问题已经解决,这里总结下,也方便我以后查阅。
linux下后台运行
通过fork实现
linux环境下,在c中守护进程是通过fork方式实现的,python也可以通过该方式实现,示例代码如下:
#!/usr/bin/envpython importtime,platform importos
deffunzioneDemo(): #这是具体业务函数示例 fout=open('/tmp/demone.log','w') whileTrue: fout.write(time.ctime()+'\n') fout.flush() time.sleep(2) fout.close()
defcreateDaemon(): #fork进程 try: ifos.fork()>0:os._exit(0) exceptOSError,error: print'fork#1failed:%d(%s)'%(error.errno,error.strerror) os._exit(1) os.chdir('/') os.setsid() os.umask(0) try: pid=os.fork() ifpid>0: print'DaemonPID%d'%pid os._exit(0) exceptOSError,error: print'fork#2failed:%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()#functiondemo
if__name__=='__main__': ifplatform.system()=="Linux": createDaemon() else: os._exit(0)