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.targetAfter:syslog.target 的 systemd 服务,但是(似乎)USB 加密狗当时还没有准备好,并且守护程序的启动失败。

    是否还有其他 systemd targetsservices 需要设置,以便仅在 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 串行加密狗上启动守护程序的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核USB 驱动

Linux守护进程之systemd

Linux上的串口和USB设备有什么区别?

没有与连接的串行端口通信?

检索用户空间 Linux C 代码中 USB 串行写入传输的缓冲区/数据包/有效负载大小

电脑连接的前一个usb