我希望能够使用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: 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();
}
当此脚本运行时,它将等待用户键入“exit”或“restart”字符串。
一切都很好,直到它重新启动并在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_process文档以及readline,但缺少某些内容。
似乎按键被发送到旧进程。
是的,我知道nodemon,forever和pm2模块。他们可以“解决”这个问题,但我想学习我所缺少的东西。