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

Ale*_*lls 4 javascript bash shell ipc node.js

我有一个 Node.js 进程,这个进程派生了一个sh子进程来运行 bash 脚本。像这样的东西:

const cp = require('child_process');

const n = cp.spawn('sh',['foo.sh'], {
     stdio: ['ignore','ignore','ignore','ipc']
});
Run Code Online (Sandbox Code Playgroud)

在我的 bash 脚本 (foo.sh) 中,如何将 IPC 消息发送回 Node.js 父进程?无法找到如何做到这一点。

做更多的研究,看起来我会越来越接近 IPC 内部结构。可能有帮助的一件事是,如果我将父 PID 传递给 bash 脚本,那么也许我可以用它做一些事情。

Cra*_*aig 6

当您添加'ipc'到您的stdio选项时,父进程和子进程将建立一个通信通道,并提供一个文件描述符供子进程使用。此描述符将在您的环境中定义为$NODE_CHANNEL_FD. 您可以将输出重定向到此描述符,它将被发送到父进程以进行解析和处理。

作为一个简单的例子,我将我的名字从 bash 脚本发送到要记录的父进程。

索引.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);
});
Run Code Online (Sandbox Code Playgroud)

文件名

printf "{\"name\": \"Craig\"}\n" 1>&$NODE_CHANNEL_FD
Run Code Online (Sandbox Code Playgroud)

bash文件中发生的基本上是:

  1. 我正在使用printf命令将 JSON 发送到stdout文件描述符 1。
  2. 然后将其重定向到引用 (&) $NODE_CHANNEL_FD

请注意,您发送的 JSON 必须正确格式化并以\n字符结尾

如果您想将数据从父进程发送到 bash 进程,您可以添加

n.send({"message": "hello world"});
Run Code Online (Sandbox Code Playgroud)

到您的 JavaScript,并且在 bash 文件中,您可以使用类似以下内容的内容

MESSAGE=read -u $NODE_CHANNEL_FD
echo " => message from parent process => $MESSAGE"
Run Code Online (Sandbox Code Playgroud)

请注意,您必须更改stdio选项,以免忽略子进程的标准输出。您可以将它们设置为['ignore', 1, 'ignore', 'ipc']使子进程的标准输出直接发送到父进程。