我正在使用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'
});
答案 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'写入流来获得预期的行为。