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]разделе. Это просто так.
Бигон