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 脚本,那么也许我可以用它做一些事情。
当您添加'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文件中发生的基本上是:
printf命令将 JSON 发送到stdout文件描述符 1。$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']使子进程的标准输出直接发送到父进程。
| 归档时间: |
|
| 查看次数: |
1720 次 |
| 最近记录: |