У меня есть простое приложение, которое транслирует видео через веб-камеру под названием «стример». Я бы хотел запустить "streamer", когда мое устройство Linux загрузится с systemd.
Затем у меня есть следующий служебный файл systemd, /lib/systemd/system/streamer.service
[Unit]
Description=Webcam Service
[Service]
ExecStart=/usr/bin/streamer
[Install]
WantedBy=multi-user.target
Когда я запускаю это вручную, он работает так:
systemctl start streamer
Однако, когда я включаю скрипт и перезагружаюсь, он не запускается автоматически:
systemctl enable streamer
reboot
Как я могу заставить это работать с моей веб-камерой?
Мне пришлось добавить правило udev для обнаружения камеры, /etc/udev/rules.d/webcam.rules
:
KERNEL=="video0", SYMLINK="video0", TAG+="systemd"
KERNEL=="video1", SYMLINK="video1", TAG+="systemd"
Затем я внес следующие изменения в свой служебный файл: /lib/systemd/system/streamer.service
:
[Unit]
Description=Webcam Service
BindsTo=dev-video1.device
After=dev-video1.device
[Service]
ExecStart=/usr/bin/streamer
Причина этого находится на странице руководства для systemd.unit
:
https://www.freedesktop.org/software/systemd/man/systemd.unit.html#BindsTo=
При использовании вместе с
After=
на том же агрегате поведениеBindsTo=
еще сильнее. В этом случае привязанный к объекту объект должен быть строго в активном состоянии, чтобы он также находился в активном состоянии.
[Install]
WantedBy=multi-user.target