我刚刚在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),但没有任何附加(我检查内存使用情况和CPU使用情况通常很高,但在这种情况下不是这样)。
任何机构都有任何想法吗?
答案 0 :(得分:1)
stdout=subprocess.PIPE
这是罪魁祸首。您正在将子进程输出重定向到管道,但您没有从该管道读取。
您可以从中读取(如果您需要该流程创建的输出),或者完全删除重定向。
修改强>
如果您希望将输出重定向到/ dev / null,无论如何您通过shell(shell=True
)启动命令,最简单的解决方案是将> /dev/null
附加到{ {1}}字符串。如果它也打印到stderr,那么你需要cmd
。
更好的解决方案,不需要通过shell启动命令,如下所示:
如果你使用的是Python 3.3或更高版本,只需传递>/dev/null 2>&1
常量:
subprocess.DEVNULL
如果没有,或者你想保持向后兼容性,只需打开/ dev / null并传递它:
subprocess.Popen(cmd, stdout=subprocess.DEVNULL, shell=True, preexec_fn=os.setsid)
答案 1 :(得分:0)
尝试以下
def exec_command(cmd):
cmd = cmd.split()
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, preexec_fn=os.setsid)
pid = process.pid
print '----------launched process with PID: ', pid
return pid