2014-02-06 63 views
0

我刚刚在python中创建了一个软件,它应该从shell中调度几个命令。 (PS:我的工作在Linux上) 顺便说一句,我创建了下面的函数来启动进程:用python通过子进程库执行进程

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

请问您可以写出print cmd的输出 – duck

+0

您是什么意思whit“print CMD”? – giogix

+0

我的意思是你给CMD作为一个列表或一个字符串 – duck

回答

1
stdout=subprocess.PIPE 

这是罪魁祸首。您正在将您的子进程输出重定向到管道,但是您并未从该管道读取数据。

您可以从中读取(如果需要该进程创建的输出),或者完全删除重定向。

编辑:

如果你想输出重定向到/ dev/null的,因为事实上,你通过shell启动的命令(shell=True)无论如何,最简单的解决办法是将追加到> /dev/nullcmd字符串。如果它也打印到​​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) 
+0

我认为我必须创建一个管道,因为当我启动进程时,会生成许多pid,并且当我杀死一个这些我希望所有连接的处理器 – giogix

+0

@ user2637212你不必使用管道来做到这一点。它更像是小孩收到SIGPIPE的副作用,一旦它试图写入另一端关闭的管道,就会死亡。例如,您可以使用进程组。请记住,在控制台中按^ C中断所有孩子?它通过向整个进程组发送SIGINT来实现。你也能做到。 – WGH

+0

那么你建议写什么,而不是stdout = subprocess.PIPE? – giogix

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 
+0

我试过这个解决方案,但它不起作用 – giogix

+0

什么是响应 – duck