LINUX.ORG.RU
ФорумAdmin

Как объяснить systemd не запускать сервис если не запускался другой?

 


0

1

Всем привет. Понятно что надо как-то играться с Wants и Requires но вот как правильно не пойму... Уж больно замысловатые и ветвистые у них описания :(

Суть такая. Есть штатный недо-сервис wpa_supplicant@.service

[Unit]
Description=WPA supplicant daemon (interface-specific version)
Requires=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device
Before=network.target
Wants=network.target

# NetworkManager users will probably want the dbus version instead.

[Service]
Type=simple
ExecStart=/sbin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -Dnl80211,wext -i%I

[Install]
Alias=multi-user.target.wants/wpa_supplicant@%i.service


И он у меня разрешён в виде wpa_supplicant@wlan0 и всё даже хорошо. Но бывают моменты, когда система загружается без WiFi (он отключаем тумблером и это по факту «вынимает» usb wifi) и такие моменты система грузится очень долго, ожидая появления wlan0 аж 2 минуты по требованию этого самого сервиса.
А можно изменить правило так, чтобы этот сервис не требовал наличие wlan0, а зависел от его наличия?
Ну нету wlan0 - не запустились без всяких таймаутов.
При этом запускаться всё так же перед network.target, а не по факту появления в системе wlan0 на стадии определения устрйоств?

А можно изменить правило так, чтобы этот сервис не требовал наличие wlan0, а зависел от его наличия?

Проблема в том, что понятие «наличия» не определено, он может появиться в любой момент.

Как вариант, можешь заменить Requires= на Requisite=. Но см. выше — тогда поведение будет зависеть от того, в какой именно момент загрузки systemd (точнее, udev) обнаружит твой сетевой адаптер.

Альтернативно, можешь убрать Alias=multi-user.target.wants/wpa_supplicant@%i.service (кстати, кто так вообще делает? WantedBy=multi-user.target правильно) и сделать WantedBy=sys-subsystem-net-devices-%i.device). Тогда юнит будет запускаться при втыкании железки, вне зависимости от того, когда это случилось.

А лучше выкинь самоделки и поставь NetworkManager (или хотя бы iwd вместо wpa_supplicant + всё тот же systemd-networkd).

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от intelfx

Ну так было с «завода»... Они и делают кто-то...

Беда в том, что если выключить wpa_supplicant@wlan0, то юнит sys-subsystem-net-devices-wlan0.device не «тригерится» при загрузке. Вот так...
К примеру sys-subsystem-net-devices-eth0.device есть.

Spider55
() автор топика
Ответ на: комментарий от vel

Странно, но не сработало...
Делал так:

systemctl edit wpa_supplicant@wlan0

добавил:

[Unit]
ConditionPathExists=/sys/class/net/wlan0 (интересно а %i тут будет работать?)

# systemctl status wpa_supplicant@wlan0                                                                                             ● wpa_supplicant@wlan0.service - WPA supplicant daemon (interface-specific version)                                                                              Loaded: loaded (/lib/systemd/system/wpa_supplicant@.service; enabled; vendor preset: enabled)                                                              Drop-In: /etc/systemd/system/wpa_supplicant@wlan0.service.d                                                                                                          └─override.conf                                                                                                                                     Active: inactive (dead)



В результате юнит всё равно стартанул:

Mar 15 15:10:32 control-2.rasp systemd[1]: sys-subsystem-net-devices-wlan0.device: Job sys-subsystem-net-devices-wlan0.device/start timed out.
Mar 15 15:10:32 control-2.rasp systemd[1]: Timed out waiting for device /sys/subsystem/net/devices/wlan0.
Mar 15 15:10:32 control-2.rasp systemd[1]: Dependency failed for WPA supplicant daemon (interface-specific version).
Mar 15 15:10:32 control-2.rasp systemd[1]: wpa_supplicant@wlan0.service: Job wpa_supplicant@wlan0.service/start failed with result 'dependency'.
Mar 15 15:10:32 control-2.rasp systemd[1]: sys-subsystem-net-devices-wlan0.device: Job sys-subsystem-net-devices-wlan0.device/start failed with result 'timeout'

Spider55
() автор топика