我刚刚用 python 创建了一个软件,它应该从 shell 中安排几个命令。 (ps:我在linux上工作) 顺便说一句,我创建了以下函数来启动进程:
def exec_command(cmd):
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)
pid = process.pid
print '----------launched process with PID: ', pid
return pid
在此之后,我使用 pid 来检查进程是否继续处于僵尸状态,如果是这种情况,则将其杀死。
有时一切正常,但有时启动的进程什么都不做。
我说的过程是:sh /home/ubuntu/programs/data-integration/kitchen.sh -file=/home/ubuntu/TrasformazioneAVM/JobAVM.kjb -level=Basic -param:processName=avm
如果我通过 shell 启动它,一切正常,但如果我使用我的函数执行它,我可以在系统监视器上看到进程(或通过 shell 使用“top”命令)但没有任何附加(我检查内存使用情况和 cpu 使用情况通常非常高,但在这种情况下不是)。
任何机构有任何想法吗?
最佳答案
stdout=subprocess.PIPE
这是罪魁祸首。您正在将子进程输出重定向到管道,但您并未从该管道读取数据。
您可以从中读取(如果您需要进程创建的输出),或者完全删除重定向。
编辑:
如果您希望将输出重定向到/dev/null,考虑到您是通过 shell (shell=True
) 启动命令的事实,最简单的解决方案是附加 >/dev/null
到 cmd
字符串。如果它也打印到 stderr,那么你需要 >/dev/null 2>&1
。
一个更好的解决方案,不需要通过 shell 启动命令,如下所示:
如果您使用的是 Python 3.3 或更高版本,只需传递 subprocess.DEVNULL
常量:
subprocess.Popen(cmd, stdout=subprocess.DEVNULL, shell=True, preexec_fn=os.setsid)
如果没有,或者你想保持向后兼容性,只需打开/dev/null 并传递它:
subprocess.Popen(cmd, stdout=open(os.devnull, "w"), shell=True, preexec_fn=os.setsid)
关于python - 通过子进程库使用 python 执行进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21600091/