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

0 投票
1 回答
4925 浏览
提问于 2025-04-18 03:15

我需要通过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 子进程

撰写回答