1

Я пытаюсь написать простой systemd сервис, который запускается, когда я вставляю DVD в привод DVD-ROM. Однако мой сервис никогда не запускается, даже если я вижу соответствующий SYSTEMD_WANTS при запуске udevadm monitor --env . Я могу запустить службу вручную, и она работает как положено.

Вот что у меня есть:


/etc/systemd/system/test.service:

[Unit]
Description=just touch /tmp/pizza

[Service]
Type=oneshot
ExecStart=/usr/sbin/touch /tmp/pizza
RemainAfterExit=yes
ExecStop=/usr/sbin/rm -v /tmp/pizza

/etc/udev/rules.d/98-dd-one-from-udev.rules:

KERNEL=="sr[0-9]*", ENV{DEVTYPE}=="disk", TAG+="systemd", ENV{SYSTEMD_WANTS}+="test.service"

Когда я запускаю сервис вручную с помощью sudo systemctl start test.service я вижу, как появляется файл /tmp/pizza , а также ожидаемые счастливые вещи в journalctl .

Когда я контролировать выход udevadm monitor --env я вижу , что моя переменная SYSTEMD_WANTS среда создается как ожидалось:

...
ID_SERIAL=MATSHITA_UJDA750_DVD_CDRW-0:0
ID_TYPE=cd
ID_USB_DRIVER=usb-storage
ID_USB_INTERFACES=:080650:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=MATSHITA
ID_VENDOR_ENC=MATSHITA
ID_VENDOR_ID=05e3
MAJOR=11
MINOR=1
SEQNUM=1822
SUBSYSTEM=block
SYSTEMD_WANTS=test.service  <--- Woohoo!
TAGS=:seat:systemd:uaccess:
USEC_INITIALIZED=6417

И все же мой сервис никогда не запускается ...

Какую связь я здесь пропускаю?

Что бы это ни стоило, я использую Arch Linux с systemd версии 218.

1 ответ1

1

SYSTEMD_WANTS обрабатывает только события "добавить"/"удалить" . В случае дисководов компакт-дисков эти события отправляются только для самого устройства, а не для носителя - поэтому служба будет запущена при обнаружении дисковода DVD-ROM и остановлена, когда дисковод отключен, независимо от того, что внутри него.

Изменения носителя сообщаются как события "изменения", и systemd не обрабатывает их, так как это потребует понимания конкретных свойств каждого типа устройства.

udevadm monitor --udev

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .