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

时间:2016-12-08 07:07:48

标签: javascript node.js bash shell ipc

我有一个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脚本,那么也许我可以用它做点什么。

1 个答案:

答案 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文件中发生的是:

  1. 我使用printf命令将JSON发送到stdout,即文件描述符1.
  2. 然后将其重定向到$NODE_CHANNEL_FD
  3. 的参考(&amp;)
      

    请注意,您发送的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;标准输出直接输给父母。