如何重新启动Node.js子进程

时间:2015-12-21 16:48:17

标签: javascript node.js process restart

我尝试以child_process的名称重新启动某个serverSpawnProcess。我可以让它停下来,但我无法重新开始。

serverSpawnProcess.stdin.write('stop\n');
serverSpawnProcess = null;
setTimeout(function() {
  serverSpawnProcess = spawn('java', [
    '-Xmx512M',
    '-Xms512M',
    '-jar',
    'server_files/minecraft_server.jar',
    'nogui'
  ]);
  response.send('r');
}, 10000);

我认为我是怎么做的,但它只会停止服务器,它不会再次产生它。 Node.js 5.3.0如果有帮助的话。

编辑为了其他任何寻找如何做到这一点的人,我最终把spawn放到了一个函数中,我称之为

serverSpawnProcess.on("close", function() {
    response.send('r2');
    // Wait for process to exit, then run again

    startServer();
 });

4 个答案:

答案 0 :(得分:1)

所以我的猜测是你的Minecraft服务器仍在运行10秒后超时(根据文档将一些数据保存到磁盘和东西),当你尝试运行另一个实例时,由于端口仍在使用而失败。

试试这样:

serverSpawnProcess.stdin.write('stop\n');
serverSpawnProcess.on("close", function() {
    // Wait for process to exit, then run again

    serverSpawnProcess = spawn('java', [
        '-Xmx512M',
        '-Xms512M',
        '-jar',
        'server_files/minecraft_server.jar',
        'nogui'
    ]);
});

同样正如https://stackoverflow.com/users/1139700/ross建议的那样,为错误事件添加一个监听器,以便准确了解您的问题。

serverSpawnProcess.on("error", function(err) {
    // ugh, something went wrong
    console.log("Server error:", err);
});

答案 1 :(得分:0)

您在什么条件下尝试重新启动它?当它出错或在特定条件下?如果是前者,请查看:http://schier.co/blog/2013/01/06/restarting-workers-in-a-nodejs-cluster.html

我能够通过以下方法嵌套我的服务器来设置我的服务器以自动重启错误:

var cluster = require('cluster');

if (cluster.isMaster) {
    cluster.fork();

    cluster.on('exit', function(deadWorker, code, signal) {
        // Restart the worker
        var worker = cluster.fork();

        // Note the process IDs
        var newPID = worker.process.pid;
        var oldPID = deadWorker.process.pid;

        // Log the event
        console.log('worker '+oldPID+' died.');
        console.log('worker '+newPID+' born.');
    });
} else {
  // server code is initialized here
}

答案 2 :(得分:0)

  var serverSpawnProcess = spawn('java', [
    '-Xmx512M',
    '-Xms512M',
    '-jar',
    'server_files/minecraft_server.jar',
    'nogui'
  ]);

serverSpawnProcess.on('exit', function (code)
{
    console.log("exit here with code: ", code);
});
serverSpawnProcess.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
});

serverSpawnProcess.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
});

答案 3 :(得分:0)

我完成此操作的方式如下。假设我有一个camCmd,它可以让我将DSLR摄像机作为网络摄像头运行,但是它会定期崩溃。目标是在不中断流的情况下自动重新启动它。下面的代码正是这样做的。

const { spawn } = require('child_process')

const camCmd = `gphoto2 --stdout --capture-movie | \
  ffmpeg -i - -vcodec rawvideo -pix_fmt yuv420p \
  -loglevel error -f v4l2 /dev/video1`

const respawn = spawned => {
  spawned.on('close', () => {
    respawn(spawn(camCmd, { shell: true }))
  })
}
respawn(spawn(camCmd, { shell: true }))

非常简单,它是一个递归函数,带有您生成的任何参数。一旦关闭,它就会使用新生成的arg进行自我调用。