使用Python向远程进程发送信号

2023-12-25

有两台机器,其中一台有脚本wait_for_signal.sh,第二个有一个名为controller.py。每个脚本的代码如下所示。

目的controller.py是产生一个调用的子进程wait_for_signal.sh脚本通过ssh。当控制器需要退出时,它需要向正在运行的远程进程发送中断wait_for_signal.sh.

等待信号.sh

#!/bin/bash
trap 'break' SIGINT
trap 'break' SIGHUP

echo "Start loop"

while true; do
  sleep 1
done

echo "Script done"

控制器.py

import os
import signal
import subprocess

remote_machine = user@ip
remote_path = path/to/script/

remote_proc = subprocess.Popen(['ssh', '-T', remote_machine, 
                               './' + remote_path + 'wait_for_signal.sh'], 
                               shell=False, stdout=subprocess.PIPE, 
                               stderr=subprocess.PIPE)

# do other stuff

os.kill(remote_proc.pid, signal.SIGINT)

目前,信号发送到本地计算机上启动 ssh 连接的进程,而不是远程计算机。这会导致本地进程停止,但远程进程继续执行。

ssh 是如何工作的以及它停止时会向远程计算机发送什么类型的信号?如何向通过 ssh 连接启动的远程进程发送适当的信号?


你正在调用ssh-T选项,这意味着它不会为远程会话分配 PTY(伪 TTY)。在这种情况下,无法通过 ssh 会话向远程进程发出信号。

SSH 协议有一个向远程进程发送信号的消息 https://www.rfc-editor.org/rfc/rfc4254#section-6.9。但是,您可能将 OpenSSH 用于客户端或服务器或两者,并且据我所知,OpenSSH 不实现信号消息。所以OpenSSH客户端无法发送消息,OpenSSH服务器也不会对其采取行动。

有一个用于发送“中断”消息的 SSH 扩展 https://www.rfc-editor.org/rfc/rfc4335 which is由 OpenSSH 支持。在交互式会话中,OpenSSH 客户端有一个转义序列 http://man.openbsd.org/ssh#ESCAPE_CHARACTERS您可以键入该命令以向服务器发送中断。 OpenSSH 服务器通过向远程会话的 PTY 发送中断来处理中断消息,unix PTY 通常会将中断视为 SIGINT。然而,中断从根本上来说是一个 TTY 概念,对于没有 PTY 的远程会话来说,这些都不起作用。

我可以想到两种方法来做你想做的事:

  1. Invoke ssh with the -tt parameter instead of -T. This will cause ssh to request a TTY for the remote session. Running the remote process through a TTY will make it act like it's running interactively. Killing the local ssh process should cause the remote process to receive a SIGHUP. Writing a Ctrl-C to the local ssh process's standard input should cause the remote process to receive a SIGINT.

  2. 打开另一个到远程主机的 ssh 会话并使用killall https://linux.die.net/man/1/killall或其他一些命令来向您想要向其发出信号的进程发出信号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Python向远程进程发送信号 的相关文章

随机推荐

  • FBSQLException 键大小超出实现

    create table RHP EmployeElement amount double precision not null comment varchar 255 loan blob element codeId varchar 30
  • 同源图像 texImage2D 的安全错误

    我目前正在学习WebGL 在对 texImage2D 的调用 纹理加载完成时调用 中 我得到以下信息SecurityError Uncaught SecurityError Failed to execute texImage2D on W
  • Windows 中是否有代表“C:\Documents and Settings”文件夹或 C:\Users 文件夹的环境变量?

    Windows 中是否有表示配置文件路径的任何环境变量或其他格式 我想以这样的方式查询 我应该获取值 C Documents and Settings 如果是 windows XP 或 2k3 或 C users 如果是 vista 或 w
  • jQuery 对向后兼容性的支持程度如何?

    我们遇到了 Mootools 不太向后兼容的问题 特别是在拖放功能方面 我想知道是否有人遇到过 jQuery 不向后兼容的类似问题 我们开始大量使用它 并考虑升级到新版本以开始使用多个需要它的插件 如果我们摆脱旧版本会遇到任何问题吗 jQu
  • 如何从 Scala 执行 shell 内置命令

    我需要检查一些系统设置 例如ulimit n来自 Linux 中的 Scala 脚本 如果我处理普通命令 我会使用scala sys process封装如 import scala sys process println ls lha 不幸
  • 扩展隐藏了我想要访问的属性。解决方法?

    我正在使用两个 Pod DropDown https github com AssistoLab DropDown and SwiftyUtils https github com tbaranes SwiftyUtils DropDown
  • Prolog 中的简化旅行推销员

    我浏览过类似的问题 但找不到与我的问题相关的任何内容 我正在努力寻找一种算法或一组 循环 来找到一条路径CityA to CityB 使用数据库 distance City1 City2 Distance 事实 到目前为止我所做的事情如下
  • Selenium IDE - 总是因任何 500 错误而失败

    有没有一种简单的方法可以告诉 Selenium IDE 任何导致 http 500 响应的操作都意味着测试失败 我的测试有 75 个页面请求长 有时 我会在中间某个地方发生崩溃并烧毁 但测试结果会显示为绿色 查看selenium api j
  • iPad 弹出窗口 - 如何指向分段控件中的一个分段?

    我有一个 iPad 弹出窗口 想要向分段控件中的一个分段呈现 指向 下面的代码工作正常 除了指针指向分段控件的中间 我更希望它指向正确的段 即段 0 或段 1 if UI USER INTERFACE IDIOM UIUserInterfa
  • log4j的优点

    有什么好处log4j过度设定System out and System err输出到日志文件 从较高的层面来看 Log4j 相对于手动日志记录的优势在于 您可以将日志记录代码与您实际想要记录的内容以及您想要记录的位置和方式分离 有关日志记录
  • 字符串乘法与 for 循环

    我正在 CodingBat com 上解决一个 Python 问题 我为打印字符串 n 次的简单问题编写了以下代码 def string times str n return n str 官方结果是 def string times str
  • oauth2 框:grant_type 参数无效或参数丢失

    我不知道我做错了什么 但每次我尝试获取令牌 当然是在用户身份验证之后 结果总是 Invalid grant typeparameter orparametermissing 可能与Box API 在获取访问令牌时始终返回无效的 grant
  • 如何在 React 的 render() 中包含 Font Awesome 图标

    每当我尝试在 React 中使用 Font Awesome 图标时render 尽管它可以在普通 HTML 中工作 但它不会显示在生成的网页上 render function return div i class fa fa spinner
  • Google 地图上的移动位置跟踪

    我需要为我的网站开发一项功能 用户可以通过该功能跟踪 Google 地图上的任何手机号码 就像下面的链接一样 转到以下链接并输入9810098109文本框中的数字以查找其在地图上的位置 http wwwa way2sms com jsp L
  • Android:动画循环进度可绘制

    我需要一个看起来像旋转进度圈的可绘制对象 我想在 GridView 内的 ImageView 等中使用该可绘制对象 因此 根据其他帖子 我从文件夹 sdk platforms android xx data res drawable 中获取
  • Tensorflow错误:DLL加载失败:找不到指定的过程

    我尝试在我的windows8 1 64位python3 6 0中使用pip安装tensorflow cpu 使用pip install tensorflow但它给了我这个错误 Traceback most recent call last
  • jq绘图到图像

    我知道这个问题已经存在 但我认为它没有得到正确的回答 到目前为止 我正在使用这种方法 对于我必须做的任何情节 它都 100 有效 请评论代码的效率等 我想知道其中是否还有错误 非常感谢 function jqplotToImg obj va
  • 哪里应该使用PageViewer?

    我已经实施了浏览器和数量Fragment作为孩子 这里每个孩子都会覆盖自己的onAttach onCreateView onViewCreated and setUserVisibleHint 在我的应用程序中 导航行为是随机的 并非每次都
  • 是否可以将矩阵映射到 igraph 对象?

    我有一个矩阵A定义自相交多边形的有序线段 A lt t matrix c 0 0 1 0 1 2 2 2 2 1 0 1 0 4 1 4 1 2 2 2 2 3 0 3 0 0 nrow 2 par mfrow c 1 3 plot A c
  • 使用Python向远程进程发送信号

    有两台机器 其中一台有脚本wait for signal sh 第二个有一个名为controller py 每个脚本的代码如下所示 目的controller py是产生一个调用的子进程wait for signal sh脚本通过ssh 当控