用sh / bash发送IPC消息给父进程(Node.js)

我有一个Node.js进程,这个进程分叉了一个shsubprocess来运行一个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文件中发生的是:

  1. 我正在使用printf命令将JSON发送到stdout ,文件描述符1。
  2. 然后将其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的标准输出直接传递给父进程。