我有一个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
答案 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
回调,我仍然可以访问它的输出。