【问题标题】:How can I terminate a remote process that I launched with a python subprocess?如何终止使用 python 子进程启动的远程进程?
【发布时间】:2020-06-10 08:53:49
【问题描述】:

这里首先供参考的是answer 问题“如何终止使用 shell=True 启动的 python 子进程”

在这种情况下,用户正在启动一个子进程,他想稍后终止它。我试过了,效果很好。

现在,我想在远程机器上做类似的事情。远程机器可以通过 ssh 访问没有问题。

所以我有

import os
import signal
import subprocess
import time


SERVER = "remote_server"

#Here initiate a subprocess that measures the cpu but this time remotely
pro= subprocess.Popen("ssh "+SERVER+ " sar -u 1 > mylog.log")

time.sleep(10)

#here kill the process (what should I put HERE??
#Kill the remote process

如您所见,我启动了一个在远程机器上运行sar -u 1 > mylog.log 的进程。此过程将开始运行 10 秒后,我希望远程进程停止。怎么弄死它??

我认为简单地输入os.killpg(os.getpgid(pro.pid), signal.SIGTERM) 不会杀死它,不是吗?

【问题讨论】:

  • 以下 Hack5 的解决方案是否适用于这个用例?我正在寻找相同问题的解决方案。

标签: python linux subprocess remote-access kill-process


【解决方案1】:

您只需proc.terminate()proc.kill()(首选第一个)

https://docs.python.org/3/library/subprocess.html#subprocess.Popen.kill

您的远程程序将被终止,因为 SSH 会自动终止不再与 SSH 会话关联的进程(大多数人很难找到)

【讨论】:

  • 你的意思是远程? (通过另一个 Popen)?
  • 所以如果我杀死 SSH 进程,我也会杀死远程进程?
  • 是的,因为 ssh 连接的另一端(守护进程)将终止未使用的内容。这是一个实现细节,你应该避免使用它
  • 如果我应该避免它,还有其他选择吗?
  • 如果您控制远程程序,您可以将其编程为从标准输入读取并在收到任何换行符时退出 - 然后您可以使用 proc.stdin.write("\n") 它将终止 - 但当然不会如果它崩溃了就不能工作。或者,它可以将自己的 PID 写入标准输出,您可以读取它,并通过 ssh 使用远程 kill 命令,但它也容易出错。
猜你喜欢
  • 2023-03-20
  • 2013-09-09
  • 2017-11-26
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多