我需要通过python脚本或python程序运行“myexe”可执行文件:
./myexe arg1 arg2 >& outfile我的做法如下:
1 import os
2 import subprocess
3 import time
4 cmd = "./myexe arg1 arg2 >& outfile"
5 print 'cmd = ', cmd
6 proc = subprocess.Popen(command, shell=True)
7 # delay for 10 seconds
8 time.sleep(10)
9 # kill the process if not finished
10 os.system("ps -e | grep \"myexe\" | awk '{print $1}'") # --- process id = x+1
11 if proc.poll() == None:
14 print 'Deliberately kill the Process= ', proc.pid # --- process id = x
15 proc.kill()在这里,我注意到,当我使用io重定向时,系统命令(行号-10)打印的进程id与其他部分(行号-14)中打印的进程id不同。
如果我使用命令"./myexe arg1 arg2",那么进程id的值是正确的。那么,如何使用shell命令使用子进程,而shell命令也使用io重定向?
这里,在同一个文件中,stderr和stdout都使用重定向。
请帮助我解决这一问题,并分享实现这一目标的有效方法。另外,如果在使用某种有效的方法没有完成任意延迟之后,我如何终止(杀死)进程id-x?
除此之外,我如何才能知道进程是成功地终止了,还是发送了一个杀死信号:我正在这样做:
if proc.wait() == 0:
print 'Terminate successfully'
else:
print 'Terminated by kill signal'也可以在调用proc.kill()之后设置一些标志。
它是否遵守python规则/预期使用?
注意:为了避免可能发生在myexe可执行文件中的无限循环场景,需要终止进程。输出文件由python脚本进一步读取(此处未显示)。
发布于 2014-04-18 12:52:26
您的PID由于shell=True参数而不同。Python生成一个中间shell进程。
流程树如下所示:
python yourscript.py
└─ /bin/sh -c ./myexe # PID shown on line 14
└─ ./myexe # PID shown on line 10用沿这两条线的东西替换第6行
outfile = open("outfile", "w")
proc = subprocess.Popen(["./myexe", "arg1", "arg2"],
stdout=outfile, stderr=outfile)并且您的PID将匹配,而这两个流将被重定向到同一个文件(确保./myexe刷新这些流)。
如果您想使用shell,您应该参考以下问题:How to terminate a python subprocess launched with shell=True。
https://stackoverflow.com/questions/23151962
复制相似问题