Я написал демон, который управляет несколькими коммуникационными протоколами через одно или несколько устройств 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 завершит запуск службы?