Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重新启动node.js应用程序,同时保持stdin和readline可用_Node.js - Fatal编程技术网

重新启动node.js应用程序,同时保持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

我希望能够使用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();
}
当此脚本运行时,它将等待用户键入“退出”或“重新启动”字符串

一切都很好,直到它重新启动并在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()
),主机都会收到通知。您可以使用退出代码来表示是否需要重新启动。