如何重新启动 Node.js 子进程
How can I restart a Node.js child process
我正在尝试重启某个名为 serverSpawnProcess
的 child_process
。我可以让它停止,但我无法再次启动它。
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();
});
您尝试在什么情况下重新启动它?什么时候出错,或者在特定条件下?如果是前者,请查看:http://schier.co/blog/2013/01/06/restarting-workers-in-a-nodejs-cluster.html
我能够将我的服务器设置为在出现错误时自动重启,方法是将我的服务器嵌套在以下方法中,该方法从上面的 link 修改而来:
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
}
所以我的猜测是在 10 秒超时后你的 minecraft 服务器仍然 运行ning(根据文档它保存一些数据到磁盘和东西)并且当你尝试 运行 另一个实例时它由于端口仍在使用而失败。
这样试试:
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://whosebug.com/users/1139700/ross 所建议的那样,为错误事件添加一个侦听器,这样您就可以确切地知道您的问题是什么。
serverSpawnProcess.on("error", function(err) {
// ugh, something went wrong
console.log("Server error:", err);
});
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);
});
我完成这个的方法如下。假设我有一个 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 调用自身。
我正在尝试重启某个名为 serverSpawnProcess
的 child_process
。我可以让它停止,但我无法再次启动它。
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();
});
您尝试在什么情况下重新启动它?什么时候出错,或者在特定条件下?如果是前者,请查看:http://schier.co/blog/2013/01/06/restarting-workers-in-a-nodejs-cluster.html
我能够将我的服务器设置为在出现错误时自动重启,方法是将我的服务器嵌套在以下方法中,该方法从上面的 link 修改而来:
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
}
所以我的猜测是在 10 秒超时后你的 minecraft 服务器仍然 运行ning(根据文档它保存一些数据到磁盘和东西)并且当你尝试 运行 另一个实例时它由于端口仍在使用而失败。
这样试试:
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://whosebug.com/users/1139700/ross 所建议的那样,为错误事件添加一个侦听器,这样您就可以确切地知道您的问题是什么。
serverSpawnProcess.on("error", function(err) {
// ugh, something went wrong
console.log("Server error:", err);
});
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);
});
我完成这个的方法如下。假设我有一个 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 调用自身。