В служебном файле systemd как мне сказать "после того, как USB готов"?
У меня есть программа, работающая на Raspbian Stretch, которая разговаривает с мобильным телефоном через USB, используя специальный протокол, реализованный поверх libusb.
Мне бы хотелось, чтобы программа запускалась при запуске, поэтому я создаю файл службы systemd, но не уверен, какую цель она должна выполнять после:
[Unit]
Description=My Program
After=network.target <-- ???
[Service]
ExecStart=/home/pi/myprogram
User=root
[Install]
WantedBy=multi-user.target
Этот контент может сделать работу, но что это должно быть после правильно? Как я могу сказать "после того, как USB будет готов"?
Большая часть информации, которую я могу найти в Интернете, касается настройки правил udev, что, как я понимаю, заключается в загрузке модуля ядра при просмотре определенного устройства, что я не думаю, что мне нужно.
Любая помощь приветствуется.
2 ответа
Я не решал это раньше, но кажется, что это может быть хорошо подходит для "активации на основе пути".
Вместо того, чтобы в вашем служебном файле содержалось предложение "After =", вы должны создать .path
файл, как описано в man systemd.path
,
Найдите подходящий файл под /dev/bus/usb
или же /sys/bus/usb
, чье присутствие указывает на то, что "USB включен". Тогда есть systemd
отслеживать путь к файлу, используя .path
файл, который вы создадите. .path
Затем файл будет активировать .service
файл, когда файл существует.
Я хотел бы создать системное устройство с помощью правила udev. Например: создать /etc/udev/rules.d/20-usb-bus.rules
с:
KERNEL=="usb[1-2]", TAG+="systemd"
При следующей загрузке (или перезагрузке правил udev) у вас будет системный блок:
# systemctl status dev-bus-usb-001-001.device
● dev-bus-usb-001-001.device - 2.0 root hub
...
# systemctl status dev-bus-usb-002-001.device
● dev-bus-usb-002-001.device - 3.0 root hub
...
Теперь вы можете запустить сервис после того, как USB-шина готова, добавив:
[Unit]
...
After=dev-bus-usb-001-001.device dev-bus-usb-002-001.device
на ваш системный сервис.