用sh / bash发送IPC消息给父进程(Node.js)
我有一个Node.js进程,这个进程分叉了一个sh
subprocess来运行一个bash脚本。 像这样的东西:
const cp = require('child_process'); const n = cp.spawn('sh',['foo.sh'], { stdio: ['ignore','ignore','ignore','ipc'] });
在我的bash脚本(foo.sh)中,如何发送IPC消息回到Node.js父进程? 无法find如何做到这一点。
做更多的研究,看起来我会更接近IPC的内部。 有一件事可能会有帮助,如果我将父PID传递给bash脚本,那么也许我可以做些什么。
当你将'ipc'
添加到你的stdio
选项时,父进程和subprocess将build立一个通信通道,并提供一个文件描述符供subprocess使用。 该描述符将在您的环境中定义为$NODE_CHANNEL_FD
。 您可以将输出redirect到此描述符,并将其发送到父进程进行parsing和处理。
作为一个简单的例子,我把我的名字从bash脚本发送到父进程进行logging。
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。 - 然后将其redirect到
$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
选项,以便您不忽略subprocess的标准输出。 您可以将它们设置为['ignore', 1, 'ignore', 'ipc']
以便subprocess的标准输出直接传递给父进程。