【问题标题】:How to kill a subprocess after 50 seconds?如何在 50 秒后杀死一个子进程?
【发布时间】:2020-10-04 08:50:24
【问题描述】:

我想我有几个问题涉及多个问题。所以首先,代码:

import subprocess
username = input ("Enter username: ")
subprocess.call(["python3", "sherlock", username])
Popen.terminate()

我正在使用subprocess 使用python3 运行sherlock 程序。问题是,无论出于何种原因,sherlock 程序在完成后都不会退出。我不确定这是sherlock 的问题,还是我这边的问题。老实说,我不在乎,只是想在它运行 50 秒后将其杀死,因为这就是运行所需的时间。

我做了一些阅读,据我所知,我应该使用Popen.terminate() 来杀死它?我知道命令需要更多运行,我需要告诉它要杀死什么......这就是我卡住的地方。我不确定如何确定正在运行的进程,然后将其杀死。我的程序 95% 发生在 sherlock 运行之后,所以它并没有走得很远,所以我需要杀死它,让我的程序继续运行。

不知道如何从这里开始......

更新:好的,所以我确定程序自行完成,而不必杀死它,但问题是一旦程序完成,python 脚本就不会继续。它只是坐在那里无所事事。有没有办法强制它移动到脚本的下一行?

【问题讨论】:

  • terminate() 是调用类创建的subprocess.Popen 实例(子进程)的方法。不过,我建议使用 Popen.wait() 方法并将 timeout 参数设置为 50 秒。
  • 我不知道sherlock 程序。它是将密码作为命令行参数还是在标准输入上等待它?

标签: python python-3.x linux subprocess popen


【解决方案1】:

来自official documentation

Popen.交流(输入=无,超时=无)

与进程交互:将数据发送到标准输入。从 stdout 和 stderr 读取数据,直到到达文件结尾。等待进程终止。

我认为这个功能正是你想要的。您应该将 50 秒传递给 timeout 参数。下面是示例代码 sn-p,同样来自文档:

proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=50)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

【讨论】:

  • 好的,所以我确定程序自己完成,而不必杀死它,但问题是一旦程序完成,python脚本就不会继续。它只是坐在那里无所事事。有没有办法强制它移动到脚本的下一行?
【解决方案2】:

一些进程挂起等待来自stdin 的数据。在这种情况下,请关闭该管道并自己等待终止。一些进程捕捉到信号,可能需要不那么微妙的踢来让它们退出。

import subprocess
username = input ("Enter username: ")
process = subprocess.Popen(["python3", "sherlock", username],
    stdin=subprocess.PIPE)
process.stdin.close()
try:
    process.wait(50)
except subprocess.TimeoutExpired:
    # timeout expired, be nice
    process.terminate()
    try:
        process.wait(2)
    except subprocess.TimeoutExpired:
        # be mean
        process.kill()
        try:
            process.wait(2)
        except TimeoutExpired:
            # zombies, run!
            print("sherlock could not be killed!")

【讨论】:

  • 您好,感谢您的建议,我试过了,但它似乎不起作用。我没有看到 sherlock 无法被杀死的消息,并且 sherlock 仍然打开/阻止其余进程运行。我没有看到任何错误或任何东西......
  • 好的,所以我确定程序自己完成,而不必杀死它,但问题是一旦程序完成,python脚本就不会继续。它只是坐在那里无所事事。有没有办法强制它移动到脚本的下一行?
【解决方案3】:

试试这样的:

import subprocess
username = input ("Enter username: ")
try:
    ret = subprocess.call(["python3", "sherlock", username], timeout=50)
except subprocess.TimeoutExpired:
    # TODO: manage exception
    pass

【讨论】:

  • 好的,所以我确定程序自己完成,而不必杀死它,但问题是一旦程序完成,python脚本就不会继续。它只是坐在那里无所事事。有没有办法强制它移动到脚本的下一行?
  • Python 脚本不继续是什么意思?程序被杀死后,关闭python实例
【解决方案4】:
import subprocess

username = input ("Enter username: ")
a_child_process = subprocess.Popen(args=["python3", "sherlock", username], stdout=subprocess.PIPE)
subprocess.Popen.terminate(a_child_process)

【讨论】:

  • 我猜你可以为终止命令添加计时器,如果这正是你真正想要的,它会在 50 秒后运行。
  • 好的,所以我确定程序自己完成,而不必杀死它,但问题是一旦程序完成,python脚本就不会继续。它只是坐在那里无所事事。有没有办法强制它移动到脚本的下一行?
猜你喜欢
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2012-05-03
  • 2013-07-24
相关资源
最近更新 更多