Nic*_*Lee 6 linux usb systemd libusb
我有一个在 Raspbian Stretch 上运行的程序,它使用在 libusb 之上实现的专用协议通过 USB 与手机通话。
我希望程序在启动时运行,所以我创建了一个 systemd 服务文件,但不确定它应该在哪个目标之后运行:
[Unit]
Description=My Program
After=network.target <-- ???
[Service]
ExecStart=/home/pi/myprogram
User=root
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
这个内容可以完成这项工作,但它应该是什么?我怎么能说“在 USB 准备好之后”?
我在网上能找到的大多数信息都是关于设置 udev 规则的,我理解这是在看到某个设备时加载内核模块,我认为这不是我想要的。
任何帮助表示赞赏。
我以前没有解决过这个问题,但它似乎很适合“基于路径的激活”。
您可以创建一个文件,而不是在服务文件中包含“After=”子句.path,如 中所述man systemd.path。
/dev/bus/usb在或下找到合适的文件/sys/bus/usb,该文件的存在表明“USB 已启动”。然后systemd使用您将创建的文件监视文件路径.path。当文件存在时,该.path文件将激活您的文件。.service
我要做的是使用 udev 规则创建一个systemd 设备单元。例如:创建/etc/udev/rules.d/20-usb-bus.rules:
KERNEL=="usb[1-2]", TAG+="systemd"\nRun Code Online (Sandbox Code Playgroud)\n\n在下次启动(或 udev 规则重新加载)时,您现在将拥有系统设备单元:
\n\n# systemctl status dev-bus-usb-001-001.device\n\xe2\x97\x8f dev-bus-usb-001-001.device - 2.0 root hub\n...\n# systemctl status dev-bus-usb-002-001.device\n\xe2\x97\x8f dev-bus-usb-002-001.device - 3.0 root hub\n...\nRun Code Online (Sandbox Code Playgroud)\n\n现在,您可以通过添加以下内容在 USB 总线准备就绪后启动服务:
\n\n[Unit]\n...\nAfter=dev-bus-usb-001-001.device dev-bus-usb-002-001.device\nRun Code Online (Sandbox Code Playgroud)\n\n到您的 systemd 服务。
\n