当 USB 设备拔出时 Systemd 服务会自行停用

当 USB 设备拔出时 Systemd 服务会自行停用

我有一个任务管理器,通过串口与arduino通信,arduino有一个OLED显示屏,可以显示系统的CPU、内存、交换、网络下载/上传、磁盘读/写使用情况。

该服务是用 Ruby 编写的,并且永远不会退出。如果拔出并重新插入 arduino,该服务会检测到这一点。

为了在启动时启用 Ruby 脚本,我有以下 systemd 服务:

[Unit]
Description=Arduino OLED as a Ultra Light-Weight System Monitor 

[Service]
ExecStart=/bin/ruby /root/.local/share/gem/ruby/3.0.0/bin/blink-tm
Restart=on-failure
User=root
Group=root

[Install]
WantedBy=multi-user.target

当我启动它时,它工作得很好。但是当我拔出arduino时,即使代码应该可以工作,该装置仍然会自行停用!我也尝试添加Type=oneshot, Type=simple, 和Type=forking, 但没有运气

这是当arduino从PC上拔出时服务的状态:

○ blink-tm.service - Arduino OLED as a Ultra Light-Weight System Monitor
     Loaded: loaded (/usr/lib/systemd/system/blink-tm.service; enabled; vendor preset: disabled)
     Active: inactive (dead) since Wed 2021-07-14 13:02:33 IST; 3min 30s ago
    Process: 3502 ExecStart=/bin/ruby /root/.local/share/gem/ruby/3.0.0/bin/blink-tm (code=exited, statu>
   Main PID: 3502 (code=exited, status=0/SUCCESS)
        CPU: 115ms

Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.41: A potential device discovered: 1a86:7523
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.41: Changing baudrate to 57600...
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.41: Successfully Changed baudrate to 57600...
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.41: No device found. Retrying 2
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.91: A potential device discovered: 1a86:7523
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.91: Changing baudrate to 57600...
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:32.91: Successfully Changed baudrate to 57600...
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:33.41: Device discovered successfully. Path: /dev/ttyUSB0
Jul 14 13:02:33 archlinux ruby[3502]: :: 13:02:33.66: Device ready!
Jul 14 13:02:33 archlinux systemd[1]: blink-tm.service: Deactivated successfully.

如前所述,Ruby 脚本永远不会失败,它会打印一些标准输出。一个例子是,/bin/ruby /root/.local/share/gem/ruby/3.0.0/bin/blink-tm当我拔出 arduino 并重新插入时,从终端运行永远不会退出。

那么自动停用服务背后的原因可能是什么?我想只要 ruby​​ 脚本运行就运行该服务。

答案1

当您从终端运行程序时,当前的 tty 是控制终端,因此打开新的 tty 不会改变这一点。当从 systemd 运行时,没有控制终端,因此open(2)在串行端口上将使其成为控制终端。当进程失去控制终端时,它们会收到 SIGHUP。您需要添加标志O_NOCTTY来阻止这种情况。man open关于标志说:

O_NOCTTY。如果路径名引用终端设备——请参阅 tty(4)——即使进程没有控制终端,它也不会成为进程的控制终端。

相关内容