倾听外部事件.Bash到NodeJS的桥

Listening for outside events. Bash to NodeJS bridge

本文关键字:NodeJS 的桥 Bash 外部 事件 倾听      更新时间:2023-09-26

在NodeJS进程中,我如何从bash中侦听事件?

例如

NodeJS

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

$ do-something 'Hello World'

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

我该怎么做?

我猜这和信号事件有关。

使用信号的问题是,你不能传递参数,其中大多数是预留给系统使用已经(我认为SIGUSR2是真正的唯一安全的一个节点,因为SIGUSR1启动调试器,那些是唯一的两个应该是用户定义的条件)。

相反,我发现这样做的最好方法是使用UNIX套接字;它们是为进程间通信设计的。

在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

使用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

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

你可以指示你的node.js代码对一个特定的信号做出反应,如下例所示:

// 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守护进程通信,您也可以在另一个端口上侦听,并使用它来接收(并最终发送)控制命令。