systemd не останавливает службу при удалении устройства

«Работает вручную, сбой в cron» почти всегда происходит из-за одного из этих:

  • различия в переменных окружения:PATHи др.;
  • другой текущий рабочий каталог;
  • отсутствие телетайпа (вероятно, не проблема с ожидаемыми сценариями );
  • разрешения (интерактивное тестирование с одним пользователем, задание cron с другим ); или
  • различные команды оболочки :выполняемые в самой командной строке cron используют одну оболочку, вы можете интерактивно использовать другую.
2
07.07.2019, 18:28
2 ответа

Хотя это предполагается в записи об ошибке, неясно, будет ли StopWhenUnneeded=trueчто-то делать при удалении устройства.man systemd.unitговорит для этого ключевого слова:

systemd will not stop units by default unless they are conflicting with other units, or the user explicitly requested their shut down.

Человек, создавший багзиллу, вместо этого создал второе правило udev, которое для вас может быть чем-то вроде

ACTION=="remove", SUBSYSTEM=="usb", ATTR{idVendor}=="1a86", ATTR{idProduct}=="7523", RUN+="/bin/systemctl --no-block stop klipper.service"
2
27.01.2020, 22:16

StopWhenUnneeded=trueработает ли как хотелось бы. Что не работает, так это деактивация устройства.

Вы можете проверить это, выполнив systemctl status DEVICENAME.deviceс вставленным и извлеченным устройством. Бьюсь об заклад, вы обнаружите, что устройство активируется, когда устройство вставлено, и остается активированным после его удаления.

Чтобы найти DEVICENAME, вы можете найти его в systemctl list-units --type=device. Вы также можете добавить ENV{SYSTEMD_ALIAS}="..."в правило udev, чтобы дать вашему устройству более предсказуемое имя устройства. См. man systemd.device.

Проблема подробно описана вhttps://github.com/systemd/systemd/issues/7587. Проблема, по-видимому, заключается в том, что в событиях ядра для удаления устройства отсутствуют теги, чтобы они даже направлялись в systemd, чтобы он знал, что нужно деактивировать устройство устройства.

Обходным путем является добавление правила udev, которое добавляет тег systemd. В вашем случае, вероятно, что-то вроде:

ACTION=="remove", SUBSYSTEM=="usb", ENV{PRODUCT}=="1a86/7523/*", TAG+="systemd"

После этого вы сможете подтвердить, что блок устройства отражает текущее состояние подключенного/отключенного устройства, а затем StopWhenUnneeded=trueв сервисном блоке остановит службу, когда устройство будет отключено.

3
15.06.2020, 13:51

Теги

Похожие вопросы