13

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

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

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

迄今为止的尝试:

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

    是否有其他 systemdtargetsservices条件,以便仅在 udev 完成设备安装并且网络准备好时启动守护程序?

  2. udev:我创建了一个 udev 规则,例如

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

    成功执行。但是守护进程(在该脚本中作为后台进程启动,带有“&”)似乎没有执行。从 udev 规则中分叉长时间运行的进程似乎也令人不悦。

正确的方法是什么?

4

2 回答 2

18

创建一个 udev 规则,例如

# cat /etc/udev/rules.d/95-serialdaemon.rules
KERNEL=="ttyUSB0", TAG+="systemd", 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
于 2013-08-27T12:08:08.573 回答
4

由于我进一步评论中的链接似乎解决了这个问题,这里是在插入某个 USB 设备时使用 udev 启动守护进程的解决方案:

在 udev 事件(设备热插拔)上启动长时间运行的 systemd 服务的正确(-ish)方式

于 2013-08-27T12:15:01.807 回答