【发布时间】:2015-10-12 00:26:50
【问题描述】:
我编写了一个守护进程,它通过一个或多个 RS232 设备(通常是 FT232R usb2serial)管理多个通信协议。 一旦出现 /dev/ttyUSB* 设备,如果检测到某些属性, systemd 被告知通过 udev 启动该守护进程:
ENV{SYSTEMD_WANTS}="%s{manufacturer}.service"
守护程序启动后,需要告诉它要打开哪个设备,我通过 udev 执行此操作:
RUN="/usr/bin/sercomc open %E{sd_name} %E{sd_proto} %N"
所以完整的 udev 规则如下所示:
ACTION=="add", SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{manufacturer}=="sercomd", ENV{SYSTEMD_WANTS}="%s{manufacturer}.service", ENV{sd_proto}="%s{product}", ENV{sd_name}="%s{serial}", RUN="/usr/bin/sercomc open %E{sd_name} %E{sd_proto} %N"
现在的问题是 RUN 在守护程序启动之前执行,因此 这个命令显然没有效果:
systemd-udevd[1638]: starting '/usr/bin/sercomc open ctl-vk1 ctserial /dev/ttyUSB0'
systemd-udevd[1632]: '/usr/bin/sercomc open ctl-vk1 ctserial /dev/ttyUSB0'(err) 'Couldn't connect to server: Connect failed: Connection refused'
[...]
sercomctl[1639]: [2015-10-12 03:05:39:291634] Serial communication daemon ver. 0.5 starting up
是否有解决此问题的推荐方法,即在 systemd 完成启动服务后触发运行命令?
【问题讨论】: