Як записати файл системного сервісного блоку, щоб він зачекав, поки не запуститься певний інтерфейс перед запуском?


12

Я намагаюся написати файл одиниці для hostapd на Debian.

Демону hostapd, здається, потрібен інтерфейс для пов’язаного інтерфейсу Wi-Fi до його запуску або в іншому випадку SEGV.

Я спробував network-online.target, але все ж отримаю SEGV. Я думаю, це тому, що network-online.target повинен бачити будь-який інтерфейс, а інші інтерфейси з'являються до того, як інтерфейс Wifi буде готовий для того, щоб Hostapd працював.

Який найкращий спосіб змусити сервіс чекати, коли певний інтерфейс буде запущений до запуску?

Відповіді:


13

Оскільки systemd 219, ви можете використовувати systemd-networkd-wait-onlineінструмент systemd безпосередньо з --interfaceпараметром, щоб вказати інтерфейс, на який потрібно чекати. Наприклад:

ExecStartPre=/usr/lib/systemd/systemd-networkd-wait-online --interface=$IFACE

Однак є застереження. Цей інструмент потрібно systemd-networkdзапустити, навіть якщо він нічого не робить у вашій конфігурації. З іншого боку, починаючи з тієї ж системи 219, systemd-networkdактивується розетка і автоматично виходить з режиму очікування. Отже, все, що вам потрібно - це засунути його в розетку.

Збираючи все це разом, модифікації файлу одиниці виглядатимуть приблизно так (із $IFACEзаміною потрібного інтерфейсу):

[Unit]
Requires=systemd-networkd.socket
After=systemd-networkd.socket
...

[Service]
ExecStartPre=/usr/lib/systemd/systemd-networkd-wait-online --interface=$IFACE
ExecStart=/usr/bin/hostapd ...
...

1
Так, саме цього я хочу. На жаль, я застряг на Debian 4.6.3 з systemd 44, тому не можу ним користуватися. Будь-які ідеї, як змусити його працювати на цій платформі? Дякую!
bigjosh

2
@bigjosh, ти завжди можеш зробити щось на кшталт perl -e 'sleep 1 until -e "/sys/class/net/myinterface"'свого ExecStartPre
Stéphane Chazelas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.