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

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

Фон

Я пишу простой скрипт для запуска в 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

Эффект

Служба работает как и ожидалось. Однако я заметил, что когда я запускаю putty на своем настольном компьютере сразу после включения светодиода, приглашение на вход не появляется немедленно. Поэтому я проверил с помощью

$ systemd-analyze plot > output.svg

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

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

Вопрос

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

решение1

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

В этом файле показано, что After=директива указана в разделе «[UNIT] SECTION OPTIONS», что указывает на ее принадлежность к [Unit]разделу файла.

В этой же документации описаны параметры раздела [INSTALL], но After=они там не указаны.

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

решение2

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

[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

Все еще не до конца понял, что я делаю, но теперь это работает. Может кто-нибудь объяснить?

Обновлять

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

Связанный контент