我试过这样的事情:
subprocess.Popen(['nohup', 'my_command'],
stdout=open('/dev/null', 'w'),
stderr=open('logfile.log', 'a'))
Run Code Online (Sandbox Code Playgroud)
如果父脚本正常退出,则此方法有效,但如果我终止脚本(Ctrl-C),则所有子进程也将被终止.有办法避免这种情况吗?
我关心的平台是OS X和Linux,使用的是Python 2.6 和 Python 2.7.
我不知道这是否是执行系统进程,并从母公司分离的正确途径,但允许家长从退出而不创建一个僵尸和/或杀死子进程.我目前正在使用子进程模块并执行此操作...
os.setsid()
os.umask(0)
p = subprocess.Popen(['nc', '-l', '8888'],
cwd=self.home,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
Run Code Online (Sandbox Code Playgroud)
os.setsid()更改了进程组,我认为这是让进程在父进程退出时继续运行的原因,因为它不再属于同一进程组.
这是正确的,这也是一种可靠的执行方式吗?
基本上,我有一个远程控制实用程序,通过套接字进行通信,允许远程启动进程,但我必须确保如果远程控制器死亡,它启动的进程继续运行不受影响.
我正在阅读关于双叉并且不确定这是否必要和/或subprocess.POpen close_fds以某种方式处理这个问题,所需要的只是更改进程组?
谢谢.
伊利亚
我有一些Python代码偶尔需要跨越一个新进程来以"一劳永逸"的方式运行shell脚本,即没有阻塞.shell脚本不会与原始Python代码通信,实际上可能会终止调用Python进程,因此启动的shell脚本不能是调用Python进程的子进程.我需要它作为一个独立的过程启动.
换句话说,假设我有mycode.py并启动script.sh.然后mycode.py将继续处理而不会阻塞.脚本script.sh将独立完成一些操作,然后实际停止并重新启动mycode.py.因此运行script.py的进程必须完全独立于mycode.py.我怎么能这样做?我认为subprocess.Popen不会阻塞,但仍然会创建一个子进程,一旦mycode.py停止就会终止,这不是我想要的.
我正在尝试构建一个启动其他完全独立进程的Python守护进程.
一般的想法是针对给定的shell命令,每隔几秒轮询一次并确保命令的k个实例正在运行.我们保持PID文件的目录,当我们轮询我们删除PID文件,其PID是不再运行和启动(并为PID文件)然而,许多流程,我们需要去ķ他们.
子进程也需要完全独立,这样如果父进程死掉,子进程就不会被杀死.根据我的阅读,似乎没有办法用subprocess模块做到这一点.为此,我使用了这里提到的片段:
http://code.activestate.com/recipes/66012-fork-a-daemon-process-on-unix/
我做了一些必要的修改(你会在附加的代码片段中看到注释掉的行):
这是我的spawn fn和测试:
import os
import sys
import subprocess
import time
def spawn(cmd, child_cwd):
"""
do the UNIX double-fork magic, see Stevens' "Advanced
Programming in the UNIX Environment" for details (ISBN 0201563177)
http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
"""
try:
pid = os.fork()
if pid > 0:
# exit first parent
#sys.exit(0) # parent daemon needs to stay alive to launch more in the future
return
except OSError, e:
sys.stderr.write("fork #1 failed: %d …Run Code Online (Sandbox Code Playgroud)