Вопрос или проблема
Я пытаюсь поддерживать службу активной как можно дольше. Это необходимо для того, чтобы сохранить критически важные коммуникации с USB-серийным устройством как можно дольше. Меня устраивает, если эту службу будут принудительно завершать.
Я пробовал поиграть с Before=Shutdown.target
, совместив это с DefaultDependencies=No
, но это, похоже, не дало никакого эффекта. Я не совсем понимаю, как эти специальные цели могут использоваться в службах, и документация не очень хорошо объясняет точную последовательность действий во время завершения работы.
Пока что лучшее, что мне удалось сделать и что имеет смысл, это использовать Before=basic.target
[Unit]
Description=ДОЛГАЯ ЖИЗНЬ СЛУЖБЫ
DefaultDependencies=no
Before=basic.target
[Service]
Type=simple
Restart=always
RestartSec=1
ExecStart=+/usr/bin/python3 -u /home/me/long_run_service.py
[Install]
WantedBy=multi-user.target
Есть ли способ сохранить службу активной дольше с помощью целей завершения (или любых других подходов)?
Спасибо
Ответ или решение
Для того чтобы удерживать сервис активным как можно дольше во время последовательности завершения, вы можете использовать несколько подходов, связанных с настройками systemd. Давайте рассмотрим более детально, как это сделать.
Настройки systemd
-
Использование
Before=shutdown.target
:
Чтобы ваш сервис мог работать до завершения системы, вы можете установить зависимость отshutdown.target
. Это поможет вам отложить остановку вашего сервиса до последней стадии завершения.[Unit] Description=LONG LIFE SERVICE DefaultDependencies=no Before=shutdown.target [Service] Type=simple Restart=always RestartSec=1 ExecStart=+/usr/bin/python3 -u /home/me/long_run_service.py [Install] WantedBy=multi-user.target
-
Использование
ExecStop
:
Вы можете добавить команду для корректного завершения работы вашего сервиса в секции[Service]
. Это может помочь вашему сервису правильно обработать завершение, если это необходимо. Вы можете использоватьExecStop
для настройки того, что делать при остановке сервиса, но помните, что при достиженииhalt
илиpoweroff
systemd может принудительно завершить вашу программу.ExecStop=/usr/bin/kill -SIGINT $MAINPID
-
Увеличение времени ожидания:
Вы можете также попробовать увеличить значениеTimeoutStopSec
, которое указывает допустимое время ожидания, прежде чем сервис будет принудительно завершён.TimeoutStopSec=300
Использование Before
и After
Обратите внимание, что порядок работы ваших сервисов может существенно повлиять на их работу. Например, если ваш сервис зависит от других, убедитесь, что они запускаются и останавливаются в нужной последовательности.
Общее управление зависимостями
Кроме того, вы можете отключить зависимости, чтобы ваш сервис не останавливался во время завершения других зависимых сервисов, что можно сделать с помощью параметра DefaultDependencies=no
.
Завершение работы
Хоть вы и указали, что готовы к принудительному завершению, если ваша программа использует ресурсы, такие как USB-подключение, убедитесь, что она правильно завершает все операции перед отключением, даже если это будет вызвано принудительно.
Примеры конфигураций
Вот пример конфигурации, который объединяет все вышесказанное:
[Unit]
Description=LONG LIFE SERVICE
DefaultDependencies=no
Before=shutdown.target
[Service]
Type=simple
Restart=always
RestartSec=1
ExecStart=/usr/bin/python3 -u /home/me/long_run_service.py
ExecStop=/usr/bin/kill -SIGINT $MAINPID
TimeoutStopSec=300
[Install]
WantedBy=multi-user.target
Заключение
Следуя этим рекомендациям, вы сможете максимизировать время работы вашего сервиса перед завершением системы. Учтите, что всякое принудительное завершение может вызвать потерю данных, поэтому старайтесь обрабатывать завершение системы, если это возможно. Если у вас возникнут дополнительные вопросы, всегда можно обратиться к документации systemd или обсудить с сообществом разработчиков.