在Node.js SSH2中发送Terminate(Ctrl + C)命令

时间:2014-03-04 06:29:02

标签: node.js ssh

我正在使用Node.js SSH2模块(https://github.com/mscdex/ssh2)。 myScript.py不断执行。如何在保持SSH连接存活的同时停止它?

var Connection = require('ssh2');
var c = new Connection();
c.on('ready', function() {
  c.exec('python myScript.py', function(err, stream) {
    if (err) throw err;
    stream.on('data', function(data, extended) {
      //this callback gets called multiple times as the script writes to stdout
      console.log((extended === 'stderr' ? 'STDERR: ' : 'STDOUT: ') + data);
      allData+=data;
    });
  });
});
c.connect({
  host: xxx.xxx.x.xx,
  port: 22,
  username: 'user',
  password: 'pass'
});

2 个答案:

答案 0 :(得分:4)

我们的研究小组遇到了同样的问题,我们的解决方案是在首次执行命令时获取远程进程的进程ID,然后在需要时将其终止。

如果你只使用kill [pid]命令,似乎python进程在后台继续分离,因此我们在下面的解决方案中使用了pkill -g [pid]命令。在其他情况下,这可能不同或相同。但我想,如果一个人不能为你工作,那么你应该尝试两种情况。

这是我们的(简化)解决方案。当然,在5秒后杀死每个exec命令是没有意义的...但是你会得到这个想法(以及一个安全的pid/conn重用范围):

var Connection = require('ssh2');
var c = new Connection();

function killProcess(conn, pid) {
    setTimeout(function() {
        console.log('Killing PID ' + pid);
        conn.exec('pkill -g ' + pid, function(){});
    }, 5000);
}

c.on('ready', function() {
    // echo $$; gives you the PID, we prepend it with the string
    // "EXEC PID: " to later on know for sure which line we grab as PID
    c.exec('echo "EXEC PID: $$";python myScript.py', function(err, stream) {
        if(err) throw err;
        stream.on('data', function(buffer) {
            var line = '' + buffer; // unbeautiful ;)
            console.log(line);
            if(line.substr(0, 10) === 'EXEC PID: ') {
                killProcess(c, line.substr(10));
            }
        }).on('end', function() {
            console.log('exec killed');
        });
    });
});
c.connect({
  host: xxx.xxx.x.xx,
  port: 22,
  username: 'user',
  password: 'pass'
});

答案 1 :(得分:2)

问题是并非所有SSH服务器都支持signal()发送的数据包,这包括撰写本文时的OpenSSH。

幸运的是,对于SIGINT,您通常可以通过将'\ x03'写入流来获得预期的行为。