Как я могу заставить свои пользовательские службы ждать, пока сеть не будет в сети?

Я написал пару системных файлов пользовательских сервисов, которые я хочу, чтобы пользователи включали и которые нуждаются в рабочем сетевом соединении. Я думал, что это будет так просто:

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 процесса 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. 

  • Настройка ipaddress с помощью systemd-networkd без ссылки
  • Возможно ли сделать загрузку системы, если systemd-networkd не удается?
  • avahi-daemon удаляет IP-адрес из моего сетевого интерфейса
  • Fedora 21 - нет сети Интернет когда-либо случалось
  • systemd-networkd не запускается при загрузке сети через pxelinux
  • systemd-networkd не перезагрузит файл конфигурации виртуального сетевого интерфейса
  • настроить беспроводной маршрутизатор с помощью файлов systemd-networkd * .net
  • Выбор для persistent-ipoib.rules для установки без RDMA? (rhel7.3)
  • 2 Solutions collect form web for “Как я могу заставить свои пользовательские службы ждать, пока сеть не будет в сети?”

    Поскольку вы не можете зависеть от системной службы, единственным решением является предоставление службы пользователя, которая определяет, находится ли сеть в сети. (Или сделайте свои сервисные системные службы.) Подробности для службы «обнаружение-онлайн» будут зависеть от вашего определения «онлайн». Например, он мог дождаться, когда пинг будет достигнут 8.8.8.8. Или для успешного разрешения имени DNS. Например, в аналогичной ситуации с vpnc, я жду, когда ping на IP-адрес vpn будет успешным.

    Затем вы можете заставлять свои службы пользователей зависеть от (после =) вашей поисковой онлайн-службы.

     #!/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 

    Я бы рекомендовал протестировать что-то вроде этого:

     # /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 того, как # /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 
    Linux и Unix - лучшая ОС в мире.