守护程序打开ttyACM0后获得控制接口并接收SIGHUP

时间:2018-07-12 11:29:56

标签: javascript node.js daemon pm2 tty

我正在读取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

有时,我注意到从计算机上卸下扫描仪后,程序重新启动。 Pm2发出一条由于SIGHUP而导致的日志消息。我看了看流程清单。当该过程开始并且没有打开扫描仪时,过程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);

    ...

当我添加return语句时,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(但现在无法重现)。

我应该使用其他功能打开设备吗?

1 个答案:

答案 0 :(得分:0)

在深入深处几天和许多不眠之夜后,我发现这只是正常现象。当没有控制终端的进程打开tty设备时,可以获得该信息。

我的解决方案是查看 createReadStream 函数,并发现可以提供一些标志(rw,r,a +,...)。但是,可以提供更多的标志。解决方案之一就是解决方案。我查看了打开的联机帮助页:

   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
});

一个有效!