倾听外部事件.Bash到NodeJS的桥
Listening for outside events. Bash to NodeJS bridge
在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守护进程通信,您也可以在另一个端口上侦听,并使用它来接收(并最终发送)控制命令。
相关文章:
- 在字符串nodejs的行上迭代
- 如何在nodejs的编码中使用承诺链
- 来自redis和nodejs的多个值
- 使用 fs/nodejs 的图像未显示在画布上
- 当在运行nodejs的服务器上调用new Date()时,Date将返回服务器启动时的日期
- 用于Emberjs的带有Nodejs的RESTful API
- 使用javascript检查nodejs的真实ip ip地址
- nodejs 的 express 和 socketio 之间的区别
- 在连接DB - NodeJs的函数中使用app.get
- 图像直接上传到 S3,带有来自 nodejs 的签名
- 如何获取从AJAX传递到NodeJS的FormData
- 使用 Nodejs 的 csvtojson 转换给出了乱码数据
- 使用 NodeJS 的请求模块进行 HTTP 身份验证,返回未定义的正文
- 如何将传递给 nodejs 的查询字符串转发到通过 res.render 提供的页面
- 使用带有 NodeJS 的图像像素数组跟踪边界
- 从 nodejs 的 mongodb 调用返回值
- 在 Mongo 和 Nodejs 的 Web 应用程序中处理跨时区的日期
- 如何基于 stdout 和 stderr 验证来自 nodejs 的 angular post 调用
- 如何在 NodeJs 的内存中下载和解压缩 zip 文件
- 倾听外部事件.Bash到NodeJS的桥