2 回答
TA贡献1834条经验 获得超8个赞
在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)
TA贡献1820条经验 获得超2个赞
子进程收到与父进程相同的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”大致等效,但我从未尝试过。)
添加回答
举报