【问题标题】:Trigger nodejs simple-ssh for a long running command and come out为长时间运行的命令触发 nodejs simple-ssh 并出来
【发布时间】:2018-01-05 18:46:29
【问题描述】:

我正在尝试使用 npm 模块“simple-ssh”触发一个 bash 脚本,该脚本在我的远程服务器上运行数小时。但是,我不想等到 bash 脚本执行完成。我想继续执行我的下一个链并结束 ssh 会话。由于我的 bash 脚本在后台运行,因此即使我结束 ssh 会话,我也希望它能够正常完成。

问题是我无法实现这一点,因为在 bash 脚本完成之前,控件永远不会脱离链中的第一个块。请提出实现此目标的方法。

server.js

const sh_script = 'sh /ws/jobs/test.sh'

var SSH = require('simple-ssh');
var ssh = new SSH({
    host: 'HOST IP',
    user: 'username',
    pass: 'password'
});

ssh
  .exec(sh_script, {
    out: function(stdout) {
        console.log(stdout);
    },
  })
  .exec('echo "exiting shell"',{
    out: function(){
        ssh.end();
        console.log("exiting");
    }
  })
  .start();

test.sh(此 shell 脚本需要数小时才能完成)

function start_ui_validation {
  ......
}

echo "Before starting subshell"
(
    start_ui_validation "params"
) &
echo "Finished"

【问题讨论】:

  • 这与 Python 无关,对吗?
  • 抱歉标记错误。我尝试了一个用于后台执行的 Python 子进程。忘记在此处添加该代码。

标签: python node.js bash express ssh


【解决方案1】:

您尝试执行的命令sh /ws/jobs/test.sh 正在前台运行,这就是控件没有返回到您后续的.exec()s 的原因。您需要将之前的进程置于后台,以便控件返回给您。这可以通过nohup 轻松实现。尝试将您的 sh_script 更改为以下内容:

sh_script = 'nohup /ws/jobs/test.sh >/dev/null 2>&1 &';

nohup 将启动与 ssh 会话分离的进程。 >/dev/null 2>&1 会将 stdout 和 stderr 从进程重定向到 /dev/null 并且最后的 & 会将您的进程置于后台。在此之后,控件应该返回到您的代码,并且下一个 exec 应该继续。

还有其他方法可以在没有 nohup 的情况下实现这一点(如果您的远程系统上没有 nohup)。你可以做sh_script = 'sh /ws/jobs/test.sh >/dev/null 2>&1 &';,它在后台启动脚本,然后添加另一个.exec('disown', {out:function() {}}),它将断开最后一个进程与你的ssh会话。仅当 nohup 由于某种原因不可用时才使用此选项。

【讨论】:

  • nohup /ws/jobs/test.sh >/dev/null 成功了。重定向标准错误,标准输出再次给了我“不明确的输出重定向”错误。再次感谢您提出的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多