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.