systemd не ждет завершения моего сервисного модуля, прежде чем запускать следующий

Вот мои две единицы:

 - name: percona_db.service
   command: start
   enable: true
   content: |
     [Unit]
     Description=Percona db
     After=docker.service
     Requires=docker.service

     [Service]
     ExecStartPre=/bin/bash -c '/usr/bin/docker start -a mysql_datastore || /usr/bin/docker run -d -v /var/lib/mysql --name mysql_datastore -p 23:23 busybox'
     ExecStart=/bin/bash -c '/usr/bin/docker start -a mypercona || /usr/bin/docker run -i -t --volumes-from mysql_datastore --name="mypercona" -p 3306:3306 --rm percona'
     ExecStop=/usr/bin/docker stop mypercona

     [Install]
     WantedBy=multi-user.target
 - name: php_fpm.service
   command: start
   enable: true
   content: |
     [Unit]
     Description=php fpm
     After=percona_db.service
     Requires=percona_db.service

     [Service]
     ExecStart=/bin/bash -c '/usr/bin/docker start -a myphpfpm_53 || /usr/bin/docker run --name myphpfpm_53 -dit -p 9000:9000  --link mypercona:db phpfpm_53'
     ExecStop=/usr/bin/docker stop myphpfpm_53

     [Install]
     WantedBy=multi-user.target

Моя проблема заключается в следующем: контейнер докеров, запущенный percona_db.service, может иногда загружаться долго (если это первая загрузка, он создаст базу данных и добавит данные, это может занять некоторое время). Службе php_fpm требуется служба percona для запуска, поскольку я связываю их вместе. И, хотя я указал:

 After=percona_db.service
 Requires=percona_db.service

systemd пытается запустить службу phpfpm до завершения работы службы percona_db и выдает ошибку о том, что контейнер percona не существует :/.

Что я делаю не так? Или что я могу сделать, чтобы заставить его работать? (может быть, искусственно заставить службу phpfpm ждать? Возможно ли это с systemd?)

спасибо !


person VsM    schedule 26.09.2014    source источник
comment
У вас есть только php_fpm.service в списке /etc/systemd/system/multi-user.target.wants или оба percona_db.service и php_fpm.service. Это не имеет значения, так как After=percona_db.service в php_fpm.service должен управлять порядком, в котором они запускаются, если оба перечислены, но стоит попытаться удалить percona_db.service из multi-user.target.wants, чтобы посмотреть, приведет ли это к правильному порядку.   -  person David C. Rankin    schedule 26.09.2014


Ответы (2)


ваш percona_db — это длительный процесс, поэтому systemd разветвит подпроцесс и позволит ему работать, и предположит, что все в порядке, и продолжит запуск php_fpm.

Это также характерно для многих сервисов, т. е. сценарий запуска возвращается до того, как приложение фактически готово. Лучший способ — написать программу для проверки состояния percona_db, которая будет ждать, пока percona_db будет готова, а затем добавить строку ExecStartPre=‹your_check_program› .. в файл службы php_fpm.

person Sproffer    schedule 29.09.2014
comment
Этот ответ обеспечивает обходной путь. Чтобы понять, что на самом деле происходит, прочитайте ответ @Umut и ссылку, которую он предоставляет. - person A. Richard; 11.03.2021

В каждом файле .service есть поле Type=[1]. Поле Type= указывает systemd, когда он должен признать, что ваш сервис готов, чтобы он мог запускать последующие сервисы.

Вы не указали Type= в файле службы в разделе [Service]. Из-за этого systemd устанавливает тип по умолчанию: Type=simple. В простом случае systemd запустит ваш процесс, указанный в ExecStart, и предположит, что все пойдет правильно. В этот момент systemd считает ваш сервис готовым.

Вы хотели бы установить Type=oneshot в вашем percona_db.service.

[1] — http://www.freedesktop.org/software/systemd/man/systemd.service.html

person Umut    schedule 14.11.2014