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

У меня есть сервис, который зависит от того, Кассандра подходит, и кластер готов и готов.

Чтобы убедиться, что порядок зависимостей удовлетворен, у меня есть следующий файловый файл

[Unit]
Requires=cassandra.service
After=cassandra.service

[Service]
Environment=JAVA_HOME=/usr/java/jre
[email protected]@/webapps/bringup-app/bin/bringup
TimeoutStartSec=0
ExecStop=
[email protected]@/logs/bringup.pid
Restart=always

[Install]
WantedBy=multi-user.target

Как я могу гарантировать, что процесс appup-app ждет в течение 30 секунд, прежде чем он попытается запустить? В настоящее время, хотя он начат после Cassandra, я заметил, что кластер Cassandra еще не завершен, и поэтому любая попытка из приложения-приложения подключиться к Cassandra как часть запуска не удалась.

Поэтому я хочу добавить задержку. Возможно ли это через файл устройства?

Ответ 1

Вы можете запустить команду sleep перед вашим ExecStart с ExecStartPre:

[Service]
ExecStartPre=/bin/sleep 30

Ответ 2

Вы можете создать .timer файл .timer для управления выполнением файла .service.

Так, например, чтобы подождать 1 минуту после загрузки, прежде чем запускать foo.service, создайте файл foo.timer в том же каталоге с содержимым:

[Timer]
OnBootSec=1min

Важно, чтобы служба была отключена (чтобы она не запускалась при загрузке), а таймер был включен, чтобы все это работало (спасибо пользователю tride за это):

systemctl disable foo.service
systemctl enable foo.timer

Вы можете найти еще несколько вариантов и всю необходимую информацию здесь: https://wiki.archlinux.org/index.php/Systemd/Timers

Ответ 3

Этот ответ на супер пользователя, я думаю, является лучшим ответом. С https://superuser.com/a/573761/67952

"Но так как вы попросили способ без использования До и После, вы можете использовать:

Type=idle

который, как объясняет man systemd.service

Поведение простоя очень похоже на простое; однако фактическое выполнение сервисной программы откладывается до тех пор, пока не будут отправлены все активные задания. Это может использоваться, чтобы избежать чередования вывода служб оболочки с выводом статуса на консоли. Обратите внимание, что этот тип полезен только для улучшения вывода на консоль, он не полезен в качестве общего инструмента для упорядочения модулей, и эффект этого типа сервиса зависит от времени ожидания 5 с, после которого сервисная программа все равно вызывается. "

Ответ 4

Вместо редактирования службы доставки добавьте задержку после запуска в службу, от которой она зависит. Отредактируйте cassandra.service так:

ExecStartPost=/bin/sleep 30

Таким образом, добавленный спящий режим не должен замедлять перезапуски запускаемых служб, которые зависят от него (хотя замедляет его собственный запуск, может быть, это желательно?).

Ответ 5

systemd способ сделать это состоит в том, чтобы заставить процесс "общаться" при его настройке, например, путем открытия сокета или отправки уведомления (или выхода из родительского сценария). Что, конечно, не всегда просто, особенно с материалами сторонних разработчиков: |

Вы могли бы сделать что-то встроенное, как

ExecStart=/bin/bash -c '/bin/start_cassandra &; do_bash_loop_waiting_for_it_to_come_up_here'

или сценарий, который делает то же самое. Или поместите do_bash_loop_waiting_for_it_to_come_up_here в ExecStartPost

Или создайте вспомогательный .service, который ожидает его появления, так что вспомогательный сервис зависит от cassandra и ожидает его запуска, тогда ваш другой процесс может зависеть от вспомогательного сервиса.

(Может также потребоваться увеличить TimeoutStartSec с 90-х по умолчанию)