Linux:在连接的USB串行加密狗上启动守护程序

时间:2013-08-27 11:09:39

标签: linux usb boot udev systemd

在我的Linux上(BeagleBone Black上的Angstrom发行版)我有一个USB加密狗作为串口出现,默认情况下可以/dev/ttyUSB0

我想启动一个守护进程,它将连接到串口并使其可用作套接字。我有这个USB到套接字桥的代码,它可以在手动启动时工作。

我想让它在系统启动时自动启动,假设USB加密狗已插入。我应该怎么做?

到目前为止的尝试:

  1. systemd:我创建了一个条件为After: remote-fs.targetAfter:syslog.target的systemd服务,但是(似乎)USB加密狗在那时还没有准备好,并且守护进程的启动失败。 / p>

    是否还有其他systemd targetsservices条件,以便只有在udev完成设备安装且网络准备好后才启动守护程序?

  2. udev:我创建了一个像

    这样的udev规则

    KERNEL ==“ttyUSB?”,RUN + =“/ path / to / daemon.sh”

    成功执行。但守护进程(在该脚本中以“&”作为后台进程启动)似乎不会执行。从udev规则分叉长时间运行的流程似乎也不赞成。

  3. 这样做的正确方法是什么?

2 个答案:

答案 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)