【问题标题】:Listening for outside events. Bash to NodeJS bridge监听外部事件。 Bash 到 NodeJS 的桥梁
【发布时间】:2014-09-17 23:06:02
【问题描述】:

在 NodeJS 进程中,如何监听来自 bash 的事件?

例如

NodeJS

obj.on("something", function (data) {
   console.log(data);
});

Bash一面

$ do-something 'Hello World'

然后在NodeJS的stdout中会出现"Hello World"消息。

我该怎么做?

我猜这和signal events有关。

【问题讨论】:

    标签: javascript node.js bash


    【解决方案1】:

    使用信号的问题是你不能传递参数,并且它们中的大多数已经保留给系统使用(我认为SIGUSR2 确实是节点唯一安全的参数,因为SIGUSR1 启动了调试器,这些是只有两个应该用于用户定义的条件)。

    相反,我发现最好的方法是使用UNIX sockets;它们是为进程间通信而设计的。

    在 node 中设置 UNIX 套接字的最简单方法是使用 net.createServer() 设置标准网络服务器,然后简单地将文件路径传递给 server.listen() 以在您指定的路径上创建套接字。 注意:重要的是该路径中的文件不存在,否则您将收到EADDRINUSE 错误。

    类似这样的:

    var net = require('net');
    
    var server = net.createServer(function(connection) {
        connection.on('data', function(data) {
            // data is a Buffer, so we'll .toString() it for this example
            console.log(data.toString());
        });
    });
    
    // This creates a UNIX socket in the current directory named "nodejs_bridge.sock"
    server.listen('nodejs_bridge.sock');
    
    // Make sure we close the server when the process exits so the file it created is removed
    process.on('exit', function() {
        server.close();
    });
    
    // Call process.exit() explicitly on ctl-c so that we actually get that event
    process.on('SIGINT', function() {
        process.exit();
    });
    
    // Resume stdin so that we don't just exit immediately
    process.stdin.resume();
    

    然后,要在 bash 中实际向该套接字发送内容,您可以像这样通过管道发送到 nc

    echo "Hello World" | nc -U nodejs_bridge.sock
    

    【讨论】:

    • +1,如果有人想知道如何输出一些东西,只需 connection.write("foo\n"); 内部数据回调。
    • 当我尝试从 bash 执行 echo "Hello World" | nc -U nodejs_bridge.sock 时,出现错误 nc: unix connect failed: No such file or directory。有人可以帮我吗?
    【解决方案2】:

    使用 FIFO 怎么样?

    NodeJS 代码:

    process.stdin.on('readable', function() {
      var chunk = process.stdin.read();
      if (chunk !== null) {
        process.stdout.write('data: ' + chunk);
      }
    });
    

    NodeJS 启动(3>/tmp/... 是保持 FIFO 开放的技巧):

    mkfifo /tmp/nodeJsProcess.fifo
    node myProgram.js </tmp/nodeJsProcess.fifo 3>/tmp/nodeJsProcess.fifo
    

    Bash 链接:

    echo Hello >/tmp/nodeJsProcess.fifo
    

    【讨论】:

    • 两个答案都不错,但我选择了 UNIX 套接字。给你们两个投票。 :-)
    【解决方案3】:

    您链接的页面中描述的信号用于向进程发送一些特定的“命令”。这称为“进程间通信”。你可以看到here IPC 的第一个定义。

    您可以指示 node.js 代码对特定信号做出反应,如 this 示例:

    // Start reading from stdin so we don't exit.
    process.stdin.resume();
    
    process.on('SIGUSR1', function() {
      console.log('Got SIGUSR1.  Here you can do something.');
    });
    

    请注意,信号是发送到进程,而不是代码中的特定对象。

    如果您需要以更具体的方式与 node.js 守护进程通信,您也可以侦听另一个端口,并使用它来接收(并最终发送)控制命令。

    【讨论】:

    • 以及如何发出这样的事件?
    • 在这种情况下,在 bash kill -9 SIGUSR1
    • @StefanoF 我想你的意思是kill -s SIGUSR1 &lt;pid&gt;
    • 是的,很抱歉,正确的语法是@MikeS 所述的语法
    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 2014-07-12
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2022-11-17
    • 2019-01-19
    • 2021-03-16
    相关资源
    最近更新 更多