
正如@mark所阐明的那样,它是一个Linux系统,通过遵循此食谱,脚本可以轻松地使其自身完全独立,即
守护程序
。(您也可以在子进程之后,然后在子进程中在父进程中执行此 *** 作)。
os.fork``os.exec...
编辑:澄清一些细节wrt
@mark对我的回答的评论:不需要超级用户权限即可按照菜谱配方“守护”进程,也无需更改当前工作目录(尽管配方确实可以做到这一点,而且,这不是关键部分-
而是
fork,
_exit和
setsid调用的正确逻辑顺序。 不会 在父进程环境中使用的各种
os.exec...变体都 不会
终止
e,因此这部分也很容易-
请参阅Python在线文档。
要解决在其他人的评论和答案中提出的建议:我相信
subprocess并且
multiprocessing本身不会守护子进程,这似乎是@mark所需要的;该脚本可以自己完成 *** 作,但是由于
某些
代码必须执行
forks和
setsid,所以对我而言,将所有生成都保留在该低层平面上似乎比较整洁,而不是在其中混合一些高层和一些低层代码手术过程。
这是上述URL处配方的大大简化版本,专门用于在父级中调用以生成守护程序子级—这样,该代码也可以用于执行非Python可执行文件。如给定的那样,该代码应满足@mark解释的需求,当然可以通过多种方式对其进行定制-
我强烈建议阅读原始配方及其注释和讨论以及其推荐的书,以获取更多信息。
import osimport sysdef spawnDaemon(path_to_executable, *args) """Spawn a completely detached subprocess (i.e., a daemon). E.g. for mark: spawnDaemon("../bin/producenotify.py", "producenotify.py", "xx") """ # fork the first time (to make a non-session-leader child process) try: pid = os.fork() except OSError, e: raise RuntimeError("1st fork failed: %s [%d]" % (e.strerror, e.errno)) if pid != 0: # parent (calling) process is all done return # detach from controlling terminal (to make child a session-leader) os.setsid() try: pid = os.fork() except OSError, e: raise RuntimeError("2nd fork failed: %s [%d]" % (e.strerror, e.errno)) raise Exception, "%s [%d]" % (e.strerror, e.errno) if pid != 0: # child process is all done os._exit(0) # grandchild process now non-session-leader, detached from parent # grandchild process must now close all open files try: maxfd = os.sysconf("SC_OPEN_MAX") except (AttributeError, ValueError): maxfd = 1024 for fd in range(maxfd): try:os.close(fd) except OSError: # ERROR, fd wasn't open to begin with (ignored)pass # redirect stdin, stdout and stderr to /dev/null os.open(os.devnull, os.O_RDWR) # standard input (0) os.dup2(0, 1) os.dup2(0, 2) # and finally let's execute the executable for the daemon! try: os.execv(path_to_executable, args) except Exception, e: # oops, we're cut off from the world, let's just give up os._exit(255)欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)