Fed*_*oni 21 python kill process
我需要在Python中执行以下操作.我想生成一个进程(子进程模块?),并且:
实现这一目标的最优雅方式是什么?
Pet*_*ers 28
该subprocess模块将是您的朋友.启动进程以获取Popen对象,然后将其传递给这样的函数.请注意,这仅在超时时引发异常.如果需要,您可以捕获异常并kill()在Popen进程上调用该方法.(杀死是Python 2.6中的新功能,顺便说一句)
import time
def wait_timeout(proc, seconds):
"""Wait for a process to finish, or raise exception after timeout"""
start = time.time()
end = start + seconds
interval = min(seconds / 1000.0, .25)
while True:
result = proc.poll()
if result is not None:
return result
if time.time() >= end:
raise RuntimeError("Process timed out")
time.sleep(interval)
Run Code Online (Sandbox Code Playgroud)
只要您知道进程PID ,使用psutil至少有两种方法可以做到这一点.假设该过程是这样创建的:
import subprocess
subp = subprocess.Popen(['progname'])
Run Code Online (Sandbox Code Playgroud)
...你可以在这样一个繁忙的循环中获得它的创建时间:
import psutil, time
TIMEOUT = 60 * 60 # 1 hour
p = psutil.Process(subp.pid)
while 1:
if (time.time() - p.create_time()) > TIMEOUT:
p.kill()
raise RuntimeError('timeout')
time.sleep(5)
Run Code Online (Sandbox Code Playgroud)
......或者简单地说,你可以这样做:
import psutil
p = psutil.Process(subp.pid)
try
p.wait(timeout=60*60)
except psutil.TimeoutExpired:
p.kill()
raise
Run Code Online (Sandbox Code Playgroud)
此外,当您遇到它时,您可能会对以下额外的API感兴趣:
>>> p.status()
'running'
>>> p.is_running()
True
>>>
Run Code Online (Sandbox Code Playgroud)
我有一个类似的问题并找到了这个答案。为了完整起见,我想添加一种在给定时间后终止挂起进程的方法:Python 信号库 https://docs.python.org/2/library/signal.html
从文档中:
import signal, os
def handler(signum, frame):
print 'Signal handler called with signal', signum
raise IOError("Couldn't open device!")
# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)
# This open() may hang indefinitely
fd = os.open('/dev/ttyS0', os.O_RDWR)
signal.alarm(0) # Disable the alarm
Run Code Online (Sandbox Code Playgroud)
由于您无论如何都想生成一个新进程,因此这可能不是解决您问题的最佳解决方案。