重新启动node.js应用程序,同时保持stdin和readline可用
我希望能够使用readline,退出当前进程并重新启动它,同时保持stdin和readline的功能 示例代码如下:重新启动node.js应用程序,同时保持stdin和readline可用,node.js,Node.js,我希望能够使用readline,退出当前进程并重新启动它,同时保持stdin和readline的功能 示例代码如下: var readline = require('readline'); var fork = require('child_process').fork; console.log("argv:", process.argv); var rl = readline.createInterface({ input: process.stdin, output: proce
var readline = require('readline');
var fork = require('child_process').fork;
console.log("argv:", process.argv);
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', (input) => {
console.log(`>>>: ${input}`);
if (input==="exit"){
process.exit();
return;
}
if (input==="restart"){
rl.close(); // whatever, has no effect
restartApp();
return;
}
});
function restartApp() {
process.on('exit', (code) => {
console.log(`About to exit with code: ${code}`);
var forked = fork(process.argv[1], ["RESTARTED"]);
});
process.exit();
}
当此脚本运行时,它将等待用户键入“退出”或“重新启动”字符串
一切都很好,直到它重新启动并在stdin上发送一次击键,抛出以下错误:
events.js:161
throw er; // Unhandled 'error' event
^
Error: read EIO
at exports._errnoException (util.js:1028:11)
at TTY.onread (net.js:572:26)
我希望如何防止此错误
我正在阅读child_过程文档和readline,但缺少一些东西
似乎击键被发送到旧进程
是的,我知道nodemon,forever和pm2模块。他们可以“解决”这个问题,但我想知道我遗漏了什么。不确定这是否可行,因为您需要类似于
execve
的东西来实现这一点,我不确定这是否以任何方式公开(当然不是通过child\u process.fork
,也许是通过child\u process.spawn
,但一些快速测试让我觉得这也行不通)。我认为这是错误的方法。群集(一个主进程和一个从进程)更适合此任务。您的意思是主进程将继续从stdin读取数据,并将数据传递给可能重新启动的子进程?不,子进程从stdin(或repl)侦听,并向主进程发送一条消息,请求重新启动进程(再次kill和fork)。哦,对。是的,这样可以:)尽管您甚至不需要向主机发送消息:如果您侦听主机中的事件,那么每当子进程退出时(使用process.exit()
),主机都会收到通知。您可以使用退出代码来表示是否需要重新启动。