2013-08-27 59 views
9

在我的Linux(在BeagleBone黑色埃发行版),我有表现为串行端口和每个默认一个USB加密狗是作为/dev/ttyUSB0的Linux:在连接USB转串口加密狗

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

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

尝试至今:

  1. systemd:我创造了条件After: remote-fs.targetAfter:syslog.target一个systemd服务,但(似乎)的USB加密狗是没有准备好,在这一点上和守护程序的启动失败。

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

  2. udev的:我创建像

    KERNEL udev规则== “ttyUSB?”,RUN + = “/路径/到/ daemon.sh”

    其执行成功。但守护进程(在该脚本中以“&”作为后台进程启动)似乎不会执行。另外它似乎被折磨,叉从udev规则长期运行的进程。

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

+0

我前一阵子也有类似的问题,这个博客文章帮助了我很多(因为它几乎正是你正在尝试做的)。 [在udev事件(设备热插拔)]上启动长时间运行的systemd服务的正确( - )方式](http://blog.fraggod.net/2012/06/16/proper-ish-way-to-start -long-running-systemd-service-on-udev-event-device-hotplug.html) –

+0

感谢您的参考,它现在的作品! – Philipp

回答

9

创建像

# cat /etc/udev/rules.d/95-serialdaemon.rules 
KERNEL=="ttyUSB0", ENV{SYSTEMD_WANTS}="serialdaemon.service" 

udev规则创建像

# 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 

一个systemd服务创建可执行文件

# 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

您可以将自己的anwser标记为“已接受”,因为这是您问题的正确解决方案。没有错...... –

3

因为在我进一步的评论的链接似乎解决这个问题,这里是使用udev启动守护进程的解决方案rtain USB设备插上电源:

Proper(-ish) way to start long-running systemd service on udev event (device hotplug)

+2

接受你的答案,让你获得积分。我的那里只是(我自己的)参考。 – Philipp

+0

此链接提供了可行的解决方案,但如果此链接将来被破解,请在您的答案中复制粘贴该链接的内容要点。当然,您需要通过提及原始链接来给予应有的信贷。 – anishsane

+0

@anishsane对不起,你是对的。这是我在SO上的第一篇帖子,如果我今天写了答案,我会这样做的。如果我有空闲时间,我会添加链接中提供的解决方案摘要。 –