У меня есть эти две службы, одна - это служба сценариев запуска 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 вообще не запускается (я использую после
в модуле) что я здесь делаю неправильно
Существует несколько различных ключевых слов для указания зависимостей юнитов systemd. Каждое из них имеет несколько иной эффект и последствия в отношении обработки сбоев, например, "запуск" и "ожидание завершения запуска", например :
Настраивает (слабые) зависимости требований от других модулей. ... Блоки, перечисленные в этом параметре, будут запущены, если конфигурирующий блок является таковым. ...
Аналогично Wants=, но объявляет более сильную зависимость от требований. ... Если этот блок будет активирован, то перечисленные блоки также будут активированы. Если один из других блоков не активируется, и для отказавшего блока установлена зависимость упорядочивания 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