当前位置: 首页 > news >正文

超时时杀死python subprocess子进程?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhajio/article/details/103289477
import subprocess as sub
import threading

class RunCmd(threading.Thread):
    def __init__(self, cmd, timeout):
        threading.Thread.__init__(self)
        self.cmd = cmd
        self.timeout = timeout

    def run(self):
        self.p = sub.Popen(self.cmd)
        self.p.wait()

    def Run(self):
        self.start()
        self.join(self.timeout)

        if self.is_alive():
            self.p.terminate()      #use self.p.kill() if process needs a kill -9
            self.join()

RunCmd(["./someProg", "arg1"], 60).Run()

这个想法是创建一个运行该命令的线程,如果超过某个合适的值(在这种情况下为60秒),则将其杀死。

也可以采用下例中的方式,使用theading.timer类,在subprocess启动的时候,start这个timer,由于timer绑定了kill subprocess事件,当超时的时候,将会把subprocess kill掉。

def run(cmd, timeout_sec):

	if (sys.version_info >= (3,5)):
		try:
			completed = subprocess.run(shlex.split(cmd), timeout=timeout_sec, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
			return completed.stdout.decode('utf-8'), completed.stderr.decode('utf-8')
		except subprocess.TimeoutExpired:
			message = 'Fitting got killed by timeout after '+str(timeout_sec)+' sec!'
			print (message)
			raise EslException(message)
	else:
		proc = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
		kill_proc = lambda p: p.kill()
		timer = Timer(timeout_sec, kill_proc, [proc])
	
		try:
			timer.start()
			stdout,stderr = proc.communicate()
		finally:
			timer.cancel()
			if (proc.poll() == -9 ):
				raise EslException('Fitting probably got killed by timeout!')
			#if (proc.poll() != 0 ):
			#	raise EslException('Fitting crashed! returned '+str(proc.poll()))
			return stdout, stderr 

 

相关文章:

  • 别再瞎猜了!“携号转网”后谁是赢家?看完这篇便知晓...
  • 安卓ssss定位
  • SpringBoot 导出 Excel
  • 剑指offer第14题:链表中倒数第k个结点
  • CodeBlocks运行程序时弹出360等杀毒软件木马拦截警告提醒
  • 金鸡百花电影节星光熠熠,成龙走红毯和机器人过招
  • roscore和conda都打不开
  • 条款10:令operator=返回一个reference to *this——82
  • PHP 注释规范
  • namenode: Unknown command
  • git 命令收集
  • android.view.InflateException: Binary XML file line #
  • HDU 1000.A + B Problem:~scanf("%d%d",&a,&b)表示什么意思 输入字母字符为什么会进入死循环
  • Docker Images: 构建单机版 Spark 镜像,解决第三方 Jar 包的依赖问题
  • mybatis缓存
  • 夜光带你走进C# 游戏开发等(八十四)擅长的领域
  • 阅读笔记(TIP2019)Subjective and Objective Quality Assessment of Stitched Images for Virtual Reality
  • 国标GB/T28181协议下EasyGBS互联网无插件视频播放器起播慢或延迟高问题解决方案
  • (C语言)求1-n的阶乘之和
  • 如何在centos7上搭建自己的项目