我正在运行一个在启动时需要设备路径的守护程序。此设备已连接到 USB 总线,但有时会断开 USB 并重新连接(连接器松动或硬件崩溃,尚未发现问题),但随后设备获得了另一个名称,例如/dev/ttyACM0
变为/dev/ttyACM1
.
它是一个虚拟串行端口,可从 AIS 接收器(感兴趣的有 Quark-elec QK-A022)输出 NMEA 数据。
我很确定只有一个设备会同时连接到 USB。
当系统中插入特定类型的设备时,有没有办法使用 systemd 启动/重新启动服务?我注意到systemctl list-units --type=device
哪个列出了设备,所以我很有希望,但到目前为止我发现的每个示例都是基于显式启动 servicename@device。
root@ais:/home/pi# systemctl list-units --type=device | fgrep STM
sys-devices-platform-soc-3f980000.usb-usb1-1\x2d1-1\x2d1.2-1\x2d1.2:1.0-tty-ttyACM1.device loaded active plugged STM32F407
我很确定只有一个设备会同时连接到 USB。
如今,在插入设备时运行守护程序的规范方法似乎是为守护程序创建一个 systemd 单元,并为引用该单元的设备添加一个 udev 条目。例如,
/etc/udev/rules.d/90-my.rules
使用以下行创建一个文件/etc/systemd/system/[email protected]
和一个文件您可能需要
sudo udevadm control --reload
和sudo systemctl daemon-reload
. 当您插入您的设备时,您的脚本应该与参数一起运行(ttyACM0
如果这是它的名称)。检查日志文件是否有错误。请参阅New-Style Daemons和Device-Based Activation
man 7 daemon
部分,以及.man systemd.device
我不知道您是否可以在 systemd 中执行此操作,但如果检测到设备更改,您可以使用 udev 重新启动/重新加载服务。