代码之家  ›  专栏  ›  技术社区  ›  gmemstr

如何重新启动节点。js子进程

  •  4
  • gmemstr  · 技术社区  · 10 年前

    我正在尝试重新启动某个 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);
    

    我想我会这样做,但它只会停止服务器,不会再产生它。节点。js 5.3.0如果有帮助。

    编辑 为了其他人寻找如何实现这一点,我最终将spawn放入了一个函数中,我这样调用

    serverSpawnProcess.on("close", function() {
        response.send('r2');
        // Wait for process to exit, then run again
    
        startServer();
     });
    
    4 回复  |  直到 10 年前
        1
  •  3
  •   camwhite    7 年前

    我实现这一点的方式如下。说我有一个 camCmd 它允许我运行一个单反相机作为我的网络摄像头,但它会定期崩溃。目标是在不中断流的情况下自动重新启动它。下面的代码就是这样做的。

    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调用自己。

        2
  •  1
  •   Community Mohan Dere    9 年前

    所以我猜在10秒超时后,minecraft服务器仍在运行(根据文档,它会将一些数据保存到磁盘等),当您尝试运行另一个实例时,由于端口仍在使用,它会失败。

    像这样试试:

    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);
    });
    
        3
  •  0
  •   Nase    10 年前

    在什么情况下,您尝试重新启动它?当它出错时,还是在特定条件下?如果是前者,请查看: 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
    }
    
        4
  •  0
  •   Gaurav joshi    10 年前
      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);
    });