Примечание. Я написал статью на Medium, в которой объясняется, как создать службу и как избежать этой конкретной проблемы: создание службы Linux с помощью systemd .
Оригинальный вопрос:
Я использую systemd, чтобы рабочий скрипт всегда работал:
[Unit]
Description=My worker
After=mysqld.service
[Service]
Type=simple
Restart=always
ExecStart=/path/to/script
[Install]
WantedBy=multi-user.target
Хотя перезапуск работает нормально, если сценарий завершается нормально через несколько минут, я заметил, что, если он неоднократно не systemd
запускается при запуске, просто перестану пытаться запустить его:
Jun 14 11:10:31 localhost systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:10:31 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:10:31 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:10:31 localhost systemd[1]: Failed to start My worker.
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'start-limit'.
Точно так же, если мой рабочий скрипт несколько раз завершается сбоем со статусом выхода 255
, systemd
прекращает попытки его перезапустить:
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:25:51 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:25:51 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:25:51 localhost systemd[1]: Failed to start My worker.
Jun 14 11:25:51 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'start-limit'.
Есть ли способ , чтобы заставить , systemd
чтобы всегда повторить через несколько секунд?
StartLimitIntervalSec=0
и вуаля.Да , есть. Вы можете указать, чтобы повторить через
x
несколько секунд в[Service]
разделе,После сохранения файла вам необходимо перезагрузить конфигурацию демона, чтобы убедиться, что
systemd
он знает о новом файле,затем перезапустите службу, чтобы включить изменения,
Как вы просили, глядя на документацию,
звучит как достойная рекомендация.
источник
RestartSec
директивы,systemd
несколько попыток перезапускается очень быстро, затем переходит в состояние постоянного сбоя; то, что не может произойти, когдаRestartSec
указано?always
это суперсетon-failure
, так что не поможет!Нет. Systemd перестает пытаться перезапустить его на некоторое время . Это ясно показано в журнале, который вы предоставляете:
Это ограничение скорости.
Длина небольшого времени указывается в сервисном блоке, используя
StartLimitIntervalSec=
настройки. Количество пусков, которое необходимо в этом интервале для запуска механизма ограничения скорости, указывается черезStartLimitBurst=
настройку. Если ничто в вашей системе не отличается от vanilla systemd, включая значения по умолчанию для этих двух настроек, то это будет 5 раз в течение 10 секунд.StartLimitIntervalSec=0
отключает ограничение скорости, поэтому systemd будет повторять попытки бесконечно, а не сдаваться. Но лучше сделать так, чтобы ваш сервис не выходил так часто или оставался достаточно простоя между выходами и перезапусками, чтобы он не превышал порог ограничения скорости.Обратите внимание, что ограничение скорости не имеет значения, как вышла ваша служба. Это вызывает количество попыток запустить / перезапустить его, независимо от их причины.
дальнейшее чтение
systemd.unit
, Системные справочные страницы. freedesktop.org.источник
StartLimitIntervalSec=10
иStartLimitIntervalSec=5
, не повезло.StartLimitIntervalSec=0
.