Я написал пару системных файлов пользовательских служб, которые я хочу, чтобы пользователи включали, и которым требуется работающее сетевое соединение. Я думал, что это будет так же просто, как:
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.
И снова сервис запускается слишком рано.
Это сообщение должно быть там? Как я могу отладить мою проблему?
РЕДАКТИРОВАТЬ : причина проста и конкретно изложена в 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.
источник
Ответы:
Поскольку вы не можете зависеть от системной службы, единственным решением для вас является предоставление пользовательской службы, которая определяет, подключена ли сеть. (Или сделайте ваши услуги системными службами.) Подробная информация о службе обнаружения «онлайн» будет зависеть от вашего определения «онлайн». Например, он может ждать пинга до 8.8.8.8. Или для разрешения имен DNS для успеха. Например, в аналогичной ситуации с vpnc я ожидаю, пока ping к IP-адресу vpn завершится успешно.
Затем вы можете сделать так, чтобы ваши пользовательские сервисы зависели от (после =) вашего пользовательского сервиса обнаружения в Интернете.
источник
Я бы порекомендовал проверить что-то вроде этого:
С последующим:
источник