从Nodejs运行shell脚本

时间:2017-01-14 12:10:46

标签: node.js shell child-process spawn

我有一个shell脚本DISTINCT,其作用是在后台生成多个java进程,然后正常退出:

start.sh

打印出一堆输出:

java -jar jar1.jar &
java -jar jar2.jar &
...
exit 0

现在我希望nodejs调用Starting jar1 Starting jar2 ... 跟踪输出,这样我就可以在start.sh完成时对其进行操作

问题是Nodejs认为starter.sh仅在已经启动的所有java进程都已死时才会完成。 这很奇怪,因为来自shell,starter.sh会立即退出,并且不再与java进程有任何关系

从节点调用时,如何使starter.sh的行为方式相同?

这是我用来产生starter.sh的代码:

starter.sh

1 个答案:

答案 0 :(得分:0)

我觉得我的问题与子节点与节点父节点共享stdio有关。确实如果java进程没有stdout写入,它们会在哪里写入。因此节点必须等待它们完成以考虑starter.sh完成

我已决定让孩子处理它自己的stdio并将starter.sh输出写入文件:

  const out = fs.openSync('/tmp/command.out', 'w');
  const err = fs.openSync('/tmp/command.err', 'w');

  const process = spawn(command, args, {detached: true, stdio: ['ignore', out , err]});
  process.unref();

  process.on('close', (code) => {
    console.log(`child process exited with code ${code}`);
    console.log(fs.readFileSync('/tmp/command.out', 'utf8');
    console.log(fs.readFileSync('/tmp/command.err', 'utf8'));
  });

这样一旦close完成就会调用starter.sh回调,我仍然可以访问它的输出。