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

Я закончил тем, что использовал этот патч для xdg-open, который просто hardcodes наводнение.

Взломайте центральный, но делает задание и по крайней мере преподавал мне это xdg-open сценарий, с которым я могу играть.

14
19.07.2015, 00:42
3 ответа

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

# /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
1
27.01.2020, 19:52

Две части:

  • bash позволяют привязать клавишу к функции readline clear-screen (которая кажется исходной целью).
  • в bash цель readline - подготовка текста (путем редактирования и т.д.) для выдачи команд в bash . Escape-последовательность будет отправлена на терминал . Ни одна из перечисленных функций для readline не будет заменять echo или printf .

Для ключевых привязок для readline требуется одно имя функции или строка литерала. В данном примере readline считывает то, что считает возможным именем функции, и игнорирует остальную часть строки.

Так что: нет, bash/readline не обеспечивают никаких полезных функций для эхирования escape-последовательности непосредственно в качестве привязки ключа. Как уже отмечалось, необходимо перейти на другой уровень с помощью эхо .

-121--90689-

При появлении запроса % N дает это (текущий сценарий/исходный файл/функция).

Таким образом, вы можете сделать:

print -P %N

или получить его от $ {(%): -% N} .

См. также $ funcsourcetrace для файлов стека вызовов.

-121--132953-

Поскольку вы не можете зависеть от системной службы, единственным решением является предоставление пользовательской службы, которая определяет, находится ли сеть в сети. (Или сделать свои услуги системными службами.) Сведения о пользовательском сервисе "detect-online" будут зависеть от вашего определения "online". Это может ждать, когда пинг до 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
3
27.01.2020, 19:52

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

В моей системе я добавил упрощенный эквивалент/lib/systemd/system/systemd-networkd-wait-online.service(WantedBy=network-online.target)и сохранил его в каталоге пользовательских сервисов:

[Unit]
Description=User Wait for Network to be Configured

[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-networkd-wait-online
RemainAfterExit=yes

[Install]
WantedBy=default.target

Затем я сделал свои пользовательские сервисы зависимыми от этого нового:

Wants=networkd-wait-online.service
After=networkd-wait-online.service

Однако Wants=не кажется необходимым из-за WantedBy=default.target. Вы можете удалить WantedBy=default.target, чтобы сделать network-wait-online.serviceнеобязательным, но тогда вам определенно понадобится Wants=network-wait-online.service.

Исходная служба systemd-networkd-wait-online.serviceсодержит больше зависимостей, но, похоже, они не работают в контексте пользователя. Кто-то может предоставить пользовательские эквиваленты для всех этих зависимостей, например. используя systemctl --user linkвместо network.targetи network-online.target, как и в других предложениях здесь, но я решил не усложнять;)

Обратите внимание, что, несмотря на создание символической ссылки на системную службу, вы НЕ говорите своему systemd --userменеджеру использовать некоторые события от systemd --systemменеджера для наблюдения за состоянием системной службы, но заставить ее работать. другой экземпляр этой службы из пользовательского контекста.

3
25.05.2021, 15:35

Теги

Похожие вопросы