Ответ 1
Вы можете запустить команду sleep перед вашим ExecStart с ExecStartPre:
[Service]
ExecStartPre=/bin/sleep 30
У меня есть сервис, который зависит от того, Кассандра подходит, и кластер готов и готов.
Чтобы убедиться, что порядок зависимостей удовлетворен, у меня есть следующий файловый файл
[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 как часть запуска не удалась.
Поэтому я хочу добавить задержку. Возможно ли это через файл устройства?
Вы можете запустить команду sleep перед вашим ExecStart с ExecStartPre:
[Service]
ExecStartPre=/bin/sleep 30
Вы можете создать .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
Этот ответ на супер пользователя, я думаю, является лучшим ответом. С https://superuser.com/a/573761/67952
"Но так как вы попросили способ без использования До и После, вы можете использовать:
Type=idle
который, как объясняет man systemd.service
Поведение простоя очень похоже на простое; однако фактическое выполнение сервисной программы откладывается до тех пор, пока не будут отправлены все активные задания. Это может использоваться, чтобы избежать чередования вывода служб оболочки с выводом статуса на консоли. Обратите внимание, что этот тип полезен только для улучшения вывода на консоль, он не полезен в качестве общего инструмента для упорядочения модулей, и эффект этого типа сервиса зависит от времени ожидания 5 с, после которого сервисная программа все равно вызывается. "
Вместо редактирования службы доставки добавьте задержку после запуска в службу, от которой она зависит. Отредактируйте cassandra.service
так:
ExecStartPost=/bin/sleep 30
Таким образом, добавленный спящий режим не должен замедлять перезапуски запускаемых служб, которые зависят от него (хотя замедляет его собственный запуск, может быть, это желательно?).
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-х по умолчанию)