I иметь службу systemd, которая имеет:
[Unit]
After=network-online.target krb5-kdc.service krb5-admin-server.service
Wants=krb5-kdc.service network-online.target krb5-admin-server.service
Служба не должна запускаться, если сетевой стек полностью не готов / полностью доступен и службы Kerberos не запущены. (Это то, чего я хочу достичь, и когда оба из них не соответствуют действительности, мой сервис не должен пытаться запускаться.)
Кажется, что мой файл модуля работает нормально для обычного использования.
При перезагрузке из меню grub2 , если я выберу «* Дополнительные параметры для Ubuntu», а затем выберу «режим восстановления» для моего ядра, а затем открою корневую оболочку и не запускаю «Включить сеть», я вижу, что моя служба пытается запуститься (и это впоследствии терпит неудачу, потому что это нуждается в полностью работающей сети, вместе со службами Kerberos).
Что я должен изменить, чтобы служба не запускалась, если сетевой стек полностью не доступен и службы Kerberos не запущены?
В корневой оболочке режима восстановления (без «Включить сеть»). ):
systemctl list-units --type target
UNIT LOAD ACTIVE SUB DESCRIPTION
basic.target loaded active active Basic System
cryptsetup.target loaded active active Encrypted Volumes
friendly-recovery.target loaded active active Friendly Recovery Mode
local-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target loaded active active Local File Systems
network-online.target loaded active active Network is Online
network-pre.target loaded active active Network (Pre)
network.target loaded active active Network
paths.target loaded active active Paths
slices.target loaded active active Slices
sockets.target loaded active active Sockets
sound.target loaded active active Sound Card
swap.target loaded active active Swap
sysinit.target loaded active active System Initialization
time-sync.target loaded active active System Time Synchronized
timers.target loaded active active Timers
В приведенном выше списке я не вижу никаких служб Kerberos, и я не знаю, почему активен целевой network.online, он должен означать что-то отличное от мои предположения.
Я также вижу на консоли во время загрузки в режиме восстановления:
[ DEPEND ] Dependency failed for Network Manager wait online
...
Reached Target Network is online
Однако сеть не работает в обычном режиме: я не могу пропинговать статический IP4-адрес этого имени хоста (результат: Сеть недоступен ). Я не могу сослаться на любой другой компьютер в моей локальной сети, хотя я могу пропинговать 127.0.0.1. Таким образом, сеть работает не полностью, и это то, чего я хочу избежать, то есть я хочу, чтобы мой сервис запускался только тогда, когда сеть полностью работает.
Кажется, я не понял, что на самом деле означает целевая сеть онлайн?
Когда моя служба пытается запуститься, время ожидания истекает, потому что соответствующие службы недоступны, поэтому systemctl status myservice.service
показывает
● myservice.service - description
Loaded: loaded (/etc/systemd/system/myservice.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: timeout) since Fri 2020-07-24 16:40:45 BST; 7s ago
Process: 1396 ExecStartPre=/usr/local/bin/get_kerberos_tickets.ksh (code=killed, signal=HUP)
Tasks: 0
Memory: 3.4M
CPU: 529ms
Jul 24 16:40:45 t7810 systemd[1]: myservice.service: Unit entered failed state.
Jul 24 16:40:45 t7810 systemd[1]: myservice.service: Failed with result 'timeout'.
Если я изменю свой модуль, чтобы добавить многопользовательский .target
на строки WANTS и AFTER, затем моя служба также пытается запустить, хотя корневая оболочка затем показывает systemctl list-units -target
имеет multi-user.target «загружен неактивный мертвый» .
The recovery mode on your systems loads network-online.target
.
Run the command
systemctl list-units --type target
to list the targets loaded in recovery mode.
The line
network-online.target loaded active active Network is Online
shows that networks' services are loaded. Hence your system behaves as expected.
An idea is to use Conflicts
, from systemd.units(7)
Conflicts= A space-separated list of unit names. Configures negative requirement dependencies. If a unit has a Конфликты = установка на другом устройстве, запуск первого остановит последний, и наоборот. Обратите внимание, что этот параметр не подразумевает зависимость порядка, аналогично Wants = и require = зависимости, описанные выше. Это означает, что для обеспечения того, чтобы конфликтующий блок был остановлен до другой модуль запущен, должна быть объявлена зависимость After = или Before =. Неважно, какой из используются две упорядоченные зависимости, потому что стоп-задания всегда упорядочиваются перед запуском, см. обсуждение в до = / после = ниже. Если блок A, конфликтующий с блоком B, планируется запустить одновременно с B, транзакция будет либо потерпеть неудачу (в случае, если оба являются обязательными частями транзакции), либо будет изменен для исправления (в случае, если одно или оба задания не являются обязательной частью транзакции). В последнем случае работа, которая не required will be removed, or in case both are not required, the unit that conflicts will be started and the unit that is conflicted is stopped.
When entering the recovery mode in grub, systemd starts to reach the friendly-recovery.target. Hence, try to set this statement in your service unit:
Conflicts=friendly-recovery.target
which should prevent to start your service while in recovery mode.