如何重新启动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(如果有帮助的话)。
EDIT为了让其他人了解如何做到这一点,我最终将派生放入了一个函数中,我像一样调用它
serverSpawnProcess.on("close", function() {
response.send('r2');
// Wait for process to exit, then run again
startServer();
});
我完成这项工作的方式如下。假设我有一个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调用自己。
所以我的猜测是,在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);
});
您试图在什么条件下重新启动它?当它出错时,或者在特定条件下?如果是前者,请查看: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
}
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);
});
相关文章:
- 如何通过子进程连接Java应用程序后在node.js中编写文件
- 节点.js子进程中的运行函数
- 如何将画布对象从子进程流式传输回 Node.js
- 在 Node.js 中使用 Jasmine 测试子进程发送
- 如何在 node.js 中关闭子进程的 stdio 管道
- 使用 node.js (子进程) 运行 shell 脚本
- 将输入数据发送到节点.js中的子进程
- 如何在 Debian 上通过 node.js 中的引用变量停止子进程
- Node.js为什么不立即启动子进程
- 通过Node.js子进程关闭CS:GO专用服务器
- 如何重新启动Node.js子进程
- 如何使用node.js查看phantomjs子进程的stdout
- Node.js分离的子进程被调用为交互式前台进程
- Node.js的子进程套接字写入在Chrome&FF
- Node.js -如何防止被中断的子进程存活
- node.js中父/子进程之间的顺序通信
- 从同一node.js子进程运行多个命令
- 将缓冲区传递给节点.js子进程
- 节点 js 子进程删除多个文件
- Node.js子进程中数据丢失