-
Notifications
You must be signed in to change notification settings - Fork 663
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
exec stream: 'exit' event triggered before 'data' events #60
Comments
Can you provide a simple example that reproduces this? Also what node version are you using? |
I'm using node v0.10.12. See this example: var ssh2 = require('ssh2');
var conn = new ssh2();
function exec(conn, cmd, callback) {
conn.exec(cmd, function(err, stream) {
if (err) throw err;
var out = "";
stream.on('data', function(data, extended) {
console.log('> DATA', cmd);
out += data.toString();
});
stream.on('exit', function(code, signal) {
console.log('> EXIT', cmd);
callback(null, out.split("\n"));
});
});
};
conn.on('ready', function() {
exec(conn, 'echo 1; seq 3', function(err, out) {
console.log('> 1 OUT', out);
exec(conn, 'echo 2; seq 3', function(err, out) {
console.log('> 2 OUT', out);
conn.end();
});
});
});
conn.connect({
host: 'host',
port: 22,
username: 'user',
privateKey: require('fs').readFileSync('key.pem')
}); Most of the time the output is:
But sometimes the output is:
The second 'data' event of command "echo 2; seq 3" was triggered after the event 'exit'. |
sorry, I closed this issue by mistake. |
Can you set |
|
You should really use the 'close' event on the stream instead of 'exit' if you're buffering data like this. Like node's child_process.spawn(), when 'exit' is emitted, the stdout/stderr "streams" can still be open. |
Tks |
I am having same problem. Using node If I run it invoking
Code: connection.on('ready', function() {
connection.exec('docker inspect ' + config.deploy.swellrt.name, function(err, stream) {
if (err) { throw err ; }
var data = '';
stream.
on('data', function(d) {
data += d;
console.log(data);
}).
on('close', function() {
console.log('data: ' + data);
var container = JSON.parse(data)[0];
if (container) {
if (container.Config.Image === taggedImage) {
// Right image is deployed
console.log('swellrt already running');
done();
connection.end();
} else {
console.log('updating swellrt');
stop(container.Id, function() {
start();
});
}
} else {
console.log('swellrt not running');
start();
}
}).
stderr.on('data', function(data) { console.log('STDERR: ' + data); });
});
}).connect(config.deploy.swellrt.ssh); Debug output:
|
@atd Can you use |
Thank you @mscdex I though I was logging I changed the code a little bit for logging the data along with the events: stream.
on('data', function(d) {
data += d;
console.dir('on data: ' + data);
}).
on('close', function() {
console.log('on close: ' + data);
var container = JSON.parse(data)[0];
[....] There is no sign of the
|
Waiting 5s inside the stream.
on('data', function(d) {
data += d;
console.dir('on data: ' + data);
}).
on('close', function() {
setTimeout(function() {
console.log('on close: ' + data);
var container = JSON.parse(data)[0];
[....]
}, 5000); |
Can you try the master branch (removing your 5s timeout too) and let me know if that works for you? |
Testing the solution to mscdex/ssh2#60
Sorry @mscdex but it still fails. Two tries, the first one passed but the job remained alive (I think the output was not closed). The second one failed with the usual behaviour |
@atd Can you provide debug output with the master branch? I want to verify that it's not closing the channel early still. |
Here it is
|
That happens sometimes, 'exit' event is triggered before 'data' events.
This is the correct flow? If yes, how do I handle this because I created a function with a callback to return the output of the ssh command and i trigger this callback in the event 'exit', and sometimes it is empty because the data comes later.
The text was updated successfully, but these errors were encountered: