使用Python脚本执行和终止shell进程
我需要通过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()
在这里我注意到,当我使用输入输出重定向时,系统命令打印的进程ID(第10行)和else部分打印的进程ID(第14行)是不一样的。
如果我使用命令"./myexe arg1 arg2",那么进程ID的值是正确的。
那么,我该如何使用subprocess模块来执行带有输入输出重定向的shell命令呢?
这里的重定向是同时用于标准错误输出和标准输出,输出到同一个文件中。
请帮我解决这个问题,并分享一个有效的方法来实现这个功能。
另外,如果进程在任意延迟后还没有结束,我该如何有效地终止(杀死)这个进程ID-x?
最后,我该如何知道进程是成功结束的还是被发送了杀死信号?我现在是这样做的:
if proc.wait() == 0:
print 'Terminate successfully'
else:
print 'Terminated by kill signal'
或者在调用proc.kill()后设置一个标志也可以使用。
这样做符合Python的规则和预期用法吗?
注意:杀死进程是为了避免在'myexe'可执行文件中可能出现的无限循环情况。outfile会被Python脚本进一步读取(这里没有显示)。
1 个回答
2
你的进程ID(PID)不同是因为使用了 shell=True
这个参数。这样,Python会先启动一个中间的命令行进程。
进程的结构图大致是这样的:
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)
这样你的进程ID就会一致,同时两个输出流也会被重定向到同一个文件里(确保 ./myexe
能够正确刷新这些输出流)。
如果你想使用命令行,建议你看看这个问题: 如何终止一个使用 shell=True 启动的 Python 子进程。