Systemd: как запустить службу после запуска другой службы

У меня есть эти две службы, одна - это служба сценариев запуска Google, а вторая - служба redis. Я хочу запустить службу redis, как только служба сценариев запуска будет запущена и завершена, у меня есть следующие конфигурации systemd но мои службы redis не будут запускаться с этой конфигурацией

google-startup-scripts.service
[Unit]
Description=Google Compute Engine Startup Scripts
After=network-online.target network.target rsyslog.service
After=google-instance-setup.service google-network-daemon.service
After=cloud-final.service multi-user.target
Wants=cloud-final.service
After=snapd.seeded.service
Wants=snapd.seeded.service

[Service]
RemainAfterExit=yes
ExecStart=/usr/bin/google_metadata_script_runner --script-type startup
KillMode=process
Type=oneshot
StandardOutput=journal+console
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

[Install]
WantedBy=multi-user.target

redis.service

[Unit]
Description=Redis In-Memory Data Store
After=google-startup-scripts.service

[Service]
Type=notify
PIDFile=/run/redis-6378.pid
ExecStart=/usr/bin/redis-getdevice /etc/redis-getdevice/6378.conf
ExecStop=/usr/bin/redis-cli -p 6378 shutdown
Restart=always

[Install]
WantedBy=multi-user.target

после запуска google-startup-script.service, выполнения операций и перехода в состояние завершено. и служба redis вообще не запускается (я использую после в модуле) что я здесь делаю неправильно

0
задан 12 February 2021 в 09:53
1 ответ

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

Wants

Настраивает (слабые) зависимости требований от других модулей. ... Блоки, перечисленные в этом параметре, будут запущены, если конфигурирующий блок является таковым. ...

Requires

Аналогично Wants=, но объявляет более сильную зависимость от требований. ... Если этот блок будет активирован, то перечисленные блоки также будут активированы. Если один из других блоков не активируется, и для отказавшего блока установлена зависимость упорядочивания After=, этот блок не будет запущен. ...

After

... Если блок foo.service содержит настройку Before=bar.service и оба блока запускаются, запуск bar.service откладывается до завершения запуска foo.service. After= является обратной величиной по отношению к Before=, т.е. если Before= гарантирует, что сконфигурированный блок будет запущен до начала запуска перечисленного блока, то After= гарантирует обратное, что перечисленный блок будет полностью запущен до запуска сконфигурированного блока. ...

В этом отношении ваш блок redid.service с зависимостью After=google-startup-scripts.service кажется правильным.

Ваша проблема, похоже, заключается в том, что служба google-startup-scripts.service имеет Type=oneshot. Диспетчер служб systemd будет считать устройство запущенным после выхода основного ExecStart= процесса.

Может случиться так, что сценарий запускает задачи для запуска и выполнения в фоновом режиме и не ждет их завершения (или завершения их запуска). Сценарий переходит к следующим шагам и затем успешно завершается, systemd считает, что устройство запущено, но один или несколько процессов еще не завершены.

Возможно, вам потребуется внести корректировку во все процессы, запущенные с /usr/bin/google_metadata_script_runner --script-type startup

1
ответ дан 24 April 2021 в 01:41

Теги

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