在我的Linux上(BeagleBone Black上的Angstrom发行版)我有一个USB加密狗作为串口出现,默认情况下可以/dev/ttyUSB0
我想启动一个守护进程,它将连接到串口并使其可用作套接字。我有这个USB到套接字桥的代码,它可以在手动启动时工作。
我想让它在系统启动时自动启动,假设USB加密狗已插入。我应该怎么做?
到目前为止的尝试:
systemd:我创建了一个条件为After: remote-fs.target
和After:syslog.target
的systemd服务,但是(似乎)USB加密狗在那时还没有准备好,并且守护进程的启动失败。 / p>
是否还有其他systemd targets
或services
条件,以便只有在udev完成设备安装且网络准备好后才启动守护程序?
udev:我创建了一个像
这样的udev规则KERNEL ==“ttyUSB?”,RUN + =“/ path / to / daemon.sh”
成功执行。但守护进程(在该脚本中以“&”作为后台进程启动)似乎不会执行。从udev规则分叉长时间运行的流程似乎也不赞成。
这样做的正确方法是什么?
答案 0 :(得分:15)
创建像
这样的udev规则# cat /etc/udev/rules.d/95-serialdaemon.rules
KERNEL=="ttyUSB0", ENV{SYSTEMD_WANTS}="serialdaemon.service"
创建类似
的系统服务# cat /lib/systemd/system/serialdaemon.service
[Unit]
Description=USB serial to socket bridge
After=remote-fs.target
After=syslog.target
[Service]
ExecStart=/mnt/serialdaemon.sh
创建可执行文件
# cat /mnt/serialdaemon.sh
#!/bin/sh
date +%F-%T >> /var/log/serialdaemon.log
/usr/local/serialdaemon/serialdaemon -serial /dev/ttyUSB0 -port 15789 -baud 38400 >> /var/log/serialdaemon.log 2>&1
date +%F-%T >> /var/log/serialdaemon.log
答案 1 :(得分:4)
由于我的进一步评论中的链接似乎解决了这个问题,这里是使用udev在插入某个USB设备时启动守护进程的解决方案:
Proper(-ish) way to start long-running systemd service on udev event (device hotplug)