从python运行一个程序,让脚本死后继续运行
我试过运行这样的东西:
subprocess.Popen(['nohup', 'my_command'], stdout=open('/dev/null', 'w'), stderr=open('logfile.log', 'a'))
这适用于父级脚本正常退出,但如果我杀死脚本(Ctrl-C),我所有的subprocess也被杀死。 有没有办法避免这种情况?
我关心的平台是OS X和Linux,使用Python 2.6 和 Python 2.7。
在Unix系统上这样做的通常方法是分叉和退出,如果你是父母。 看看os.fork()
。 你可以在这里看看更多的信息。
这是一个可以完成这项工作的function:
def spawnDaemon(func): # do the UNIX double-fork magic, see Stevens' "Advanced # Programming in the UNIX Environment" for details (ISBN 0201563177) try: pid = os.fork() if pid > 0: # parent process, return and keep running return except OSError, e: print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) os.setsid() # do second fork try: pid = os.fork() if pid > 0: # exit from second parent sys.exit(0) except OSError, e: print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) # do stuff func() # all done os._exit(os.EX_OK)
subprocess接收与您的父进程相同的SIGINT,因为它在同一个进程组中。 您可以通过在subprocess中调用os.setpgrp()将该subprocess放在自己的进程组中。 Popen的preexec_fn参数在这里很有用:
subprocess.Popen(['nohup', 'my_command'], stdout=open('/dev/null', 'w'), stderr=open('logfile.log', 'a'), preexec_fn=os.setpgrp )
(preexec_fn仅适用于un * x-oids,对于Windows来说,似乎有一个相当于“creationflags = CREATE_NEW_PROCESS_GROUP”的粗略等价物,但是我从来没有尝试过)。
在一个单独的线程中运行subprocess.Popen()。