Systemd: как запустить сервис systemd после полного подключения к сети?


12

Фон

Я пишу простой скрипт для запуска в Raspbain на Raspberry Pi 2, просто включите светодиод, чтобы указать, что я готов подключиться к SSH с моего настольного компьютера.

Сценарий здесь не важен, стоит только упомянуть, что, поскольку я использую управление частотой, поэтому сценарий выполняет бесконечный цикл, чтобы часто включать и выключать светодиод. Так что это пример простого обслуживания. Однако, по крайней мере, принятый ответ на этот вопрос советует мне установить тип в режим ожидания. Так что мой сервисный файл выглядит так

[Unit]
Description=Turn on LED after SSH is ready

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
Wants=network-online.target
After=network-online.target

эффект

Сервис работает как положено. Тем не менее, я заметил, что когда я запускаю замазку на моем настольном компьютере, сразу после того, как загорится светодиодный индикатор, приглашение для входа в систему не появится сразу. Итак, я проверил с

$ systemd-analyze plot > output.svg

Результат показывает

введите описание изображения здесь

Вопрос

Похоже, что мои службы запускаются не после network-online.target, что здесь не так и как я могу это исправить?

Ответы:


11

Когда возникает вопрос о директиве systemd, вы можете использовать ее, man systemd.directivesчтобы найти, где она задокументирована. В этом случае это показывает, что After=задокументировано в man systemd.unit.

В этом файле показано, что After=директива указана в «ПАРАМЕТРАХ РАЗДЕЛА [UNIT]», что указывает на то, что она относится к [Unit]разделу файла.

Та же самая документация также документирует опции раздела [INSTALL] и там After=не указана.

Короче говоря, ваша After=директива была в неправильном месте файла модуля, поэтому он не имел никакого эффекта, пока вы не переместили его в правильное местоположение.


Для ясности, в данном случае «[Unit]» - это «[Service]», поскольку это служебный файл.
faho

Копируемый ответ с исправлениями был бы намного лучше!
GerardJP

@GerardJP Лучше научить человека ловить рыбу, чем кормить его в течение дня. Как только люди узнают, как использовать документацию systemd, они смогут найти авторитетные ответы, не тратя время на StackExchange, просматривая сторонние документы.
Марк Стосберг

11

Исправьте это, изменив службу как

[Unit]
Description=Turn on LED after SSH is ready
After=network-online.target

[Service]
Type=idle
ExecStart=/usr/bin/sshready.py

[Install]
WantedBy=network-online.target

До сих пор не до конца понял, что я делал, но теперь это работает. Кто-нибудь может объяснить, пожалуйста?

Обновить

Этот ответ был создан мной прежде, чем принятый ответ приходит.


Это After=директива должна быть в [Unit]разделе. Это просто так.
Бигон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.