предотвратить запуск службы systemd в режиме восстановления

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 «загружен неактивный мертвый» .

0
задан 24 July 2020 в 20:00

1 ответ

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.

1
ответ дан 30 July 2020 в 22:04

Другие вопросы по тегам:

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