我有一个Node.js进程,这个进程分叉sh
子进程来运行bash脚本。像这样:
const cp = require('child_process');
const n = cp.spawn('sh',['foo.sh'], {
stdio: ['ignore','ignore','ignore','ipc']
});
在我的bash脚本(foo.sh)中,如何将IPC消息发送回Node.js父进程?无法找到如何做到这一点。
进行更多研究,看起来我将更接近IPC内部。有一件事可能会有所帮助,如果我将父PID传递给bash脚本,那么也许我可以用它做点什么。
答案 0 :(得分:3)
将'ipc'
添加到stdio
选项时,父进程和子进程将建立通信通道,并为子进程提供要使用的文件描述符。此描述符将在您的环境中定义为$NODE_CHANNEL_FD
。您可以将输出重定向到此描述符,它将被发送到父进程以进行解析和处理。
作为一个简单的例子,我将我的名字从bash脚本发送到要记录的父进程。
<强> index.js 强>
const cp = require('child_process');
const n = cp.spawn('sh', ['foo.sh'], {
stdio: ['ignore', 'ignore', 'ignore', 'ipc']
});
n.on('message', (data) => {
console.log('name: ' + data.name);
});
<强> foo.sh 强>
printf "{\"name\": \"Craig\"}\n" 1>&$NODE_CHANNEL_FD
基本上bash文件中发生的是:
printf
命令将JSON发送到stdout
,即文件描述符1. $NODE_CHANNEL_FD
请注意,您发送的JSON必须正确格式化并以
终止\n
字符
如果您想将数据从父流程发送到bash流程,您可以添加
n.send({"message": "hello world"});
到你的JavaScript,在bash文件中你可以使用
的内容MESSAGE=read -u $NODE_CHANNEL_FD
echo " => message from parent process => $MESSAGE"
请注意,您必须更改
stdio
选项,这样才不会忽略子进程的标准输出。您可以将它们设置为['ignore', 1, 'ignore', 'ipc']
,以便子进程处理&#39;标准输出直接输给父母。