从python运行程序,并在脚本被杀死后继续运行

我试过运行这样的事情:


subprocess.Popen(['nohup', 'my_command'],

                 stdout=open('/dev/null', 'w'),

                 stderr=open('logfile.log', 'a'))

如果父脚本正常退出,则此方法有效,但是如果我终止了该脚本(Ctrl-C),我的所有子进程也将全部终止。有办法避免这种情况吗?


我关心的平台是使用Python 2.6 和 Python 2.7的OS X和Linux 。


慕侠2389804
浏览 703回答 2
2回答

MMMHUHU

在Unix系统上,执行此操作的通常方法是分叉并退出(如果您是父母)。看一看os.fork()。这是完成任务的函数: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)

DIEA

子进程收到与父进程相同的SIGINT,因为它在同一进程组中。您可以通过在子进程中调用os.setpgrp()将该子进程放入其自己的进程组。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-oid。Windows似乎与“ creationflags = CREATE_NEW_PROCESS_GROUP”大致等效,但我从未尝试过。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python