使用python脚本执行和终止shell进程

时间:2014-04-18 10:12:52

标签: python shell

我需要通过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与else部分(行号-14)中打印的进程ID不同。

如果我使用命令“./myexe arg1 arg2”,那么进程ID的值是正确的。 那么,如何使用shell命令同时使用io重定向?

此处重定向用于同一文件中的stderr和stdout。

请帮助我解决问题并分享有效的方法来实现这一目标。 而且如果使用某种有效的方法在任意延迟之后没有完成,我如何终止(终止)进程id-x?

除此之外,我怎么能知道进程是成功终止还是通过发送kill信号: 我这样做如下:

if proc.wait() == 0:
   print 'Terminate successfully'
else:
   print 'Terminated by kill signal'

也可以在调用proc.kill()后设置一些标志。

它是否符合python规则/预期用法?

注意: 需要杀死进程以避免myexe可执行文件中可能发生的无限循环场景。 python脚本进一步读取outfile(此处未显示)。

1 个答案:

答案 0 :(得分:1)

由于shell=True参数,您的PID不同。 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