Як змусити мої користувацькі служби чекати, поки мережа стане в мережі?


15

Я написав пару системних файлів обслуговування користувачів, які я хочу, щоб користувачі ввімкнули і які потребують робочого мережевого з'єднання. Я думав, що це буде так просто, як:

Wants=network-online.target
After=network-online.target

Однак послуги, здається, починаються занадто рано, і journalctlя бачу:

network-online.target: Cannot add dependency job, ignoring: Unit network-online.target failed to load: No such file or directory.

Потім я шукав ще й намагався

Wants=network.target
After=network.target

і зробив sudo systemctl enable systemd-networkd-wait-online.service.

Зараз я маю journalctl:

network.target: Cannot add dependency job, ignoring: Unit network.target failed to load: No such file or directory.

І знову послуга починається занадто рано.

Це повідомлення повинно бути там? Як я можу налагодити свою проблему?


EDIT : причина проста і конкретно вказана в Arch Wiki :

systemd --userзапускається як окремий процес від systemd --systemпроцесу. Користувацькі блоки не можуть посилатися або залежати від системних блоків.

Цей пост на форумі, здається, пропонує просте рішення: я повинен linkвикористовувати необхідний системний блок як користувач, таким чином створюючи посилання на нього, доступне на шляху пошуку одиниць.

Після цього я не бачу жодних No such file or directoryповідомлень, однак я все ще не можу змусити служби фактично запускатися після того, як мережа в Інтернеті. Я спробував зв'язування network.target, network-online.targetі systemd-networkd-wait-online.service, встановивши свої одиниці, залежить від кожного з них, але безуспішно. Коли я перевіряю стан підключеного пристрою в режимі користувача, то всі вони є деякими мертвими, наприклад:

$ systemctl --user status network.target
● network.target - Network
   Loaded: loaded (/usr/lib/systemd/system/network.target; linked; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:systemd.special(7)
           http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
$ systemctl status network.target
● network.target - Network
   Loaded: loaded (/usr/lib/systemd/system/network.target; static; vendor preset: disabled)
   Active: active since Sat 2015-07-18 19:20:11 MSK; 3h 35min ago
     Docs: man:systemd.special(7)
           http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget

Jul 18 19:20:11 calc-server systemd[1]: Reached target Network.
Jul 18 19:20:11 calc-server systemd[1]: Starting Network.

Однак я можу бачити network-online.targetактивним в режимі користувача після його посилання:

$ systemctl --user status network-online.target
● network-online.target - Network is Online
   Loaded: loaded (/usr/lib/systemd/system/network-online.target; linked; vendor preset: enabled)
   Active: active since Sun 2015-07-19 00:35:38 MSK; 2min 48s ago
     Docs: man:systemd.special(7)
           http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget

Jul 19 00:35:38 calc-server systemd[469]: Reached target Network is Online.
Jul 19 00:35:38 calc-server systemd[469]: Starting Network is Online.

Сподіваюся, у вас буде відповідь.

@Deleteme Спасибі, я думаю, що я знайшов причину цього (див. Оновлення), але не як вирішити проблему.
Лев Левицький

Чи кожен ви знаходили рішення цієї проблеми? Також я помічаю, що ви підкреслюєте, що лише деякі пов'язані підрозділи мертві. Які з них працювали, і чим вони відрізняються?
Sparhawk

@Sparhawk, на жаль, ні. Як вирішення, я просто використовую таймери, встановлені на кілька секунд після завантаження. Питання має приклад: цільова мережа в мережі є активною після з'єднання, а мережева ціль - ні.
Лев Левицький

Можливо, я неправильно розумію, але я шукаю що-небудь для запускання кожного разу, коли мережа поновлюється, щоб перевірити електронну пошту після відновлення з призупинення. Я думав, що це буде спосіб зробити це. Я бачу приклади зараз. Я думав, ти маєш на увазі, що деякі спеціальні послуги звільняються, а деякі - ні. Однак, я бачу, зараз ви говорите про користувацькі версії мережевих цілей.
Sparhawk

Відповіді:


3

Оскільки ви не можете залежати від системної послуги, ваше єдине рішення - це надання послуги користувача, яка визначає, чи є мережа в мережі. (Або зробіть ваші сервісні сервісні послуги.) Деталі для користувальницької служби "виявити онлайн" залежать від вашого визначення поняття "онлайн". Наприклад, це може зачекати, коли ping до 8.8.8.8 буде успішним. Або для досягнення успішної здатності імені DNS. Наприклад, у подібній ситуації з vpnc, я чекаю, коли ping до vpn IP буде успішним.

Тоді ви можете зробити так, щоб ваші користувацькі послуги залежали від (After =) вашого сервісу користувачів із виявленням через Інтернет.

#!/bin/sh

host="${1:-8.8.8.8}"

pingcheck() {
  ping -n -c 1 -w 5 $1 >/dev/null 2>&1
}

# Do you want a timeout ?
while :; do
  pingcheck ${host} && exit 0
  sleep 10
done

Дякую, це здається розумним і досить простим. Але якщо 10 користувачів увімкнуть моє обслуговування користувачів, буде 10 випадків одночасно пінг-сервера на одному сервері, що здається трохи зайвим. На практиці це, мабуть, не викликає сумнівів, але я питав це з надією отримати єдиний "онлайн-прапор", доступний для всіх служб користувача. Однак поки що не запропоновано кращих рішень.
Лев Левицький

1

Я рекомендую протестувати щось подібне:

# /etc/systemd/system/foo.service
[Unit]
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/logger -t foo "testing online target"

[Install]
WantedBy=multi-user.target

Далі:

# systemctl daemon-reload && systemctl enable foo.service

5
Але це системна послуга, і я намагаюся налаштувати службу користувача.
Лев Левицький
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.