私は 3 つの Ubuntu サーバーを持っています。それらを A、B、C と呼びましょう。サーバー A には、node.js と socket.io をインストールしました。サーバー B には、Apache と php をインストールしました。サーバー B からサーバー A に php 経由で socket.io イベントを送信したいと考えています。イベントが発生すると、サーバー A はサーバー C に ssh し、「再起動」コマンドを実行します。
node.js のセットアップに成功しました。
var Connection = require("ssh2");
var sys = require("sys");
var exec = require("child_process").exec;
var io = require("socket.io").listen(81);
var c = new Connection();
c.on("connect", function(){
console.log("Connection :: connect");
});
c.on("ready", function(){
console.log("Connection :: ready");
c.exec("reboot", function(err, stream){
if(err) throw err;
stream.on("data", function(data, extended){
console.log((extended === "stderr" ? "STDERR: " : "STDOUT: ") + data);
});
stream.on("end", function(){
console.log("Stream :: EOF");
});
stream.on("close", function(){
console.log("Stream :: close");
});
stream.on("exit", function(code, signal){
console.log("Stream :: exit :: code: " + code + ", signal: " + signal);
c.end();
});
});
});
c.on("error", function(err){
console.log("Connection :: error :: " + err);
});
c.on("end", function(){
console.log("Connection :: end");
});
c.on("close", function(had_error){
console.log("Console :: close");
});
io.sockets.on("connection", function (socket) {
socket.on("my_event", function (data) {
c.connect({
host: data.ip,
port: 22,
username: "root",
privateKey: require("fs").readFileSync("/root/.ssh/id")
});
});
});
イベントを正常に送信でき、サーバー C が再起動しますが、イベントを 1 回しか送信できません。2 回目の試行では、リクエストは「準備完了」状態になりません。ログで確認できます。
info - socket.io started
debug - client authorized .......
Connection :: connect
debug - got disconnection packet ......
Connection :: ready
Stream :: exit :: code: 0, signal: undefined
Stream :: EOF
Stream :: close
Connection :: end
Console :: close
debug - client authorized .......
Connection :: connect
debug - got disconnection packet ......
Connection :: end
Console :: close
何をすればよいでしょうか?