【问题标题】:How do I send SIGINT to a process startet in a Net::SSH session?如何在 Net::SSH 会话中将 SIGINT 发送到进程 startet?
【发布时间】:2018-12-13 23:24:44
【问题描述】:

我使用 Net::SSHv2 连接到服务器并在该服务器上启动脚本。到目前为止它正在工作,但我想在脚本运行超过 10 分钟或输出文件变得太大时中断脚本。收到中断后,脚本将关闭并输出一些统计信息。

我当前的代码如下所示:

File.open(filename, "w") do |f|
  Net::SSH.start(host, user, password: password) do |ssh|
    ssh.exec! "do_work"  do |channel, stream, data|
      f << "data"
      #break if f.size > 1024 * 1024 * 100 #file size > 100 MB
      #channel.send_data "^C" if f.size > 1024 * 1024 * 100 #file size > 100 MB
    end
  end
end

我尝试了其他一些方法,为通道打开一个块并请求一个 shell,但没有成功。

【问题讨论】:

  • 如果我没记错的话,您正在中断正在运行的应用程序,这将终止会话。相反,我认为您需要进入 shell 提示符,在该框的后台执行您的程序,然后使用 kill 执行“^C”该进程。您必须通过 an Expect-like interface 处理 shell 提示,才能知道您何时到达 shell 并返回它。 stackoverflow.com/questions/492482/… 和相关问题也可能会有所帮助。

标签: ruby net-ssh


【解决方案1】:

send_data 是正确的方法,但是:

  1. 您需要一个 PTY 才能将控制代码发送到服务器,这也意味着您需要在执行之前打开一个通道。
  2. 代码中没有任何内容可以理解插入符号 (^) 后跟大写 C 字符的人类显示约定,表示“发送按 CTRL+C 时由键盘 BIOS 生成的字符” .您必须发送 ASCII 字符本身,它是 ETX(文本结尾)控制字符,在 C 十六进制转义序列中表示为 \x03
  3. 这在技术上不是SIGINT 信号 - 它是与 POSIX 信号 IPC 无关的终端中断信号,但 shell 通常将 ETX 解释为“用户希望我向进程发送 SIGINT” -这是您需要 PTY 的主要原因 - 它指示系统外壳程序遵守此“键盘生成的控制字符应转换为信号”约定。目前无法通过常见的 SSH 实现通过 SSH 会话发送实际信号。有关详细信息,请参阅this answer to a similar (though not Ruby specific) question

您的代码应该如下所示:

File.open(filename, "w") do |f|
  Net::SSH.start(host, user, password: password) do |ssh|
    ssh.open_channel do |channel|
      channel.request_pty
      channel.exec "do_work" do |ch, success|
        raise "could not execute command: #{command.inspect}" unless success

        channel.on_data do |ch2, data|
          f << data
        end

        #break if f.size > 1024 * 1024 * 100 #file size > 100 MB
        channel.send_data "\x03" if f.size > 1024 * 1024 * 100 #file size > 100 MB
      end
    end.wait
  end
end

频道工作代码或多或少是从session.rb source code 复制而来的。详情请参阅。

【讨论】:

    猜你喜欢
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    相关资源
    最近更新 更多