javascript - 守护进程在打开 ttyACM0 后获取控制接口并接收 SIGHUP
问题描述
我在我的 NodeJS 程序中读取手持扫描仪作为后台服务。这是由 pm2 框架处理的。
ion@ion:~$ pm2 --version
2.10.4
ion@ion:~$ node -v
v8.9.4
ion@ion:~$ cat /etc/debian_version
9.4
ion@ion:~$ uname -r
4.9.0-6-amd64
有时我注意到当我将扫描仪与电脑分离时程序重新启动。由于 SIGHUP,Pm2 发出了一条日志消息。我查看了进程列表。当进程启动并且没有打开扫描仪时,进程 616 如下所示:
ion@ion:~$ ps -e | grep node
601 ? 00:00:02 node /home/ion/
7420 ? 00:00:19 node /mnt/data/
连接扫描仪后,它已成功注册为 /dev/ttyACM0 设备并由我的程序打开。然后得到进程的控制界面:
ion@ion:~$ sudo dmesg | tail
[ 12.341225] IPv6: ADDRCONF(NETDEV_CHANGE): enp2s0: link becomes ready
[ 427.725859] usb 1-2: new full-speed USB device number 7 using xhci_hcd
[ 427.874564] usb 1-2: New USB device found, idVendor=05f9, idProduct=4204
[ 427.874572] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 427.874638] usb 1-2: Product: Handheld Barcode Scanner
[ 427.874642] usb 1-2: Manufacturer: Datalogic ADC, Inc.
[ 427.874646] usb 1-2: SerialNumber: S/N E17A28236
[ 427.901364] cdc_acm 1-2:1.0: ttyACM0: USB ACM device
[ 427.902747] usbcore: registered new interface driver cdc_acm
[ 427.902752] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
ion@ion:~$ ps -e | grep node
601 ? 00:00:02 node /home/ion/
7420 ttyACM0 00:00:26 node /mnt/data/
这是正常和预期的行为吗?我试图在我的程序中确保这一点。我通过以下方式打开设备:
openDev(dev) {
console.log("Opening scanner " + devdir + dev);
var inp = fs.createReadStream(devdir + dev);
...
当我在 createReadStream 调用之前添加返回时,设备不会成为控制终端。当我在 createReadStream 调用后直接添加返回时,设备确实成为控制终端。当我现在将扫描仪与 USB 分离时,pm2 会记录以下消息,并且我的程序将重新启动。
PM2 | App [server] with id [1] and pid [7420], exited with code [0] via signal [SIGHUP]
PM2 | Starting execution sequence in -fork mode- for app name:server id:1
PM2 | App name:server id:1 online
任何人都可以帮助我为什么扫描仪获得我的过程的控制界面吗?我遇到的问题是我的程序在扫描时也收到了 SIGINT(但我现在无法重现)。
我应该使用其他功能打开设备吗?
解决方案
在深挖了几天和很多不眠之夜后,我发现这只是一种正常的行为。没有控制终端的进程可以在打开 tty 设备时获取此信息。
我的解决方案是查看createReadStream函数,发现可以提供一些标志(rw、r、a+、...)。然而,可以提供更多的标志。其中之一就是解决方案。我查看了open的联机帮助页:
O_NOCTTY
If pathname refers to a terminal device—see tty(4)—it will not become the process's con‐
trolling terminal even if the process does not have one.
我通过以下方式修改了显示器的打开方式:
var inp = fs.createReadStream(DEVDIR + dev, {
flags: fs.constants.O_NOCTTY
});
它有效!
推荐阅读
- c# - 微服务标准 Healthcheck 和 API 响应
- regex - How do I perform a regex test in bash that starts with spaces and includes quotation marks?
- c# - DocuSign 选项卡中的复选框问题
- android - React-native 应用程序在 android studio 中崩溃而没有错误
- python - Python:当我尝试将字符串转换为列表时,字符串索引出或范围在while循环中
- sql-server - Gitlab-CI 无法连接到基于 Windows 的容器上的服务
- python - 如何将 csv 文件作为字典读取,以便键是元组
- html - 显示 flex 在 Material UI Grid Item 中不起作用
- docker - 在 ubuntu 容器中运行 docker
- reactjs - 单击 testcafe 中的范围下拉菜单