Linux:在连接的 USB 串行加密狗上启动守护程序
Posted
技术标签:
【中文标题】Linux:在连接的 USB 串行加密狗上启动守护程序【英文标题】:Linux: Start daemon on connected USB-serial dongle 【发布时间】:2013-08-30 02:25:58 【问题描述】:在我的 Linux(BeagleBone Black 上的 Angstrom 发行版)上,我有一个 USB 加密狗,它显示为串行端口,默认情况下以 /dev/ttyUSB0
的形式提供
我想启动一个守护程序,它将连接到串行端口并使其作为套接字可用。我有这个 USB 到插座桥接器的代码,它在手动启动时可以工作。
我希望它在系统启动时自动启动,假设 USB 加密狗已插入。我应该怎么做?
目前的尝试:
systemd:我创建了一个带有条件 After: remote-fs.target
和 After:syslog.target
的 systemd 服务,但是(似乎)USB 加密狗当时还没有准备好,并且守护程序的启动失败。
是否还有其他 systemd targets
或 services
需要设置,以便仅在 udev 完成设备安装并且网络准备好时启动守护进程?
udev:我创建了一个类似
的 udev 规则KERNEL=="ttyUSB?", RUN+="/path/to/daemon.sh"
成功执行。但是守护进程(在该脚本中作为后台进程启动,带有“&”)似乎没有执行。此外,从 udev 规则中分叉长时间运行的进程似乎也不受欢迎。
正确的做法是什么?
【问题讨论】:
前段时间我遇到了类似的问题,这篇博客文章对我帮助很大(因为它几乎正是您想要做的)。 Proper(-ish) way to start long-running systemd service on udev event (device hotplug) 感谢您的参考,现在可以使用了! 【参考方案1】:创建类似的 udev 规则
# cat /etc/udev/rules.d/95-serialdaemon.rules
KERNEL=="ttyUSB0", TAG+="systemd", ENVSYSTEMD_WANTS="serialdaemon.service"
创建一个类似的 systemd 服务
# 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
【讨论】:
您可以将自己的答案标记为“已接受”,因为它是您问题的正确解决方案。没什么不好的... 文件位置可以改进:.service
文件应该放在/etc/systemd/system
中,而可执行文件应该放在/usr/local/bin
中。【参考方案2】:
由于我进一步评论中的链接似乎解决了这个问题,所以这里是在插入某个 USB 设备时使用 udev 启动守护程序的解决方案:
Proper(-ish) way to start long-running systemd service on udev event (device hotplug)
【讨论】:
接受您的回答,以便您获得积分。我的只是为了(我自己的)参考。 此链接提供了可行的解决方案,但如果此链接将来损坏,请在您的答案中复制粘贴该链接的内容要点。当然,您需要通过提及原始链接来给予应有的信任。 @anishsane 对不起,你是对的。这是我关于 SO 的第一篇文章,如果我今天写了答案,我会这样做的。如果我有空闲时间,我将添加链接中提供的解决方案的摘要。 没有问题。我只是将其作为一般准则说...此外,这对我最近有帮助:)以上是关于Linux:在连接的 USB 串行加密狗上启动守护程序的主要内容,如果未能解决你的问题,请参考以下文章