SystemdDoctor
мешает работе oneshot конфигурация

Одноразовая задача: как не получить ложный сбой

Одноразовые задачи ведут себя иначе, чем постоянные службы: они завершаются, и это нормально. Ошибки возникают на стыке — когда от такой задачи ждут поведения службы или наоборот.

Что это значит

Правило простое: Type=oneshot для задач, которые отрабатывают и завершаются. Если состояние «выполнено» должно сохраняться, добавьте RemainAfterExit=yes. Если задачу вызывает таймер или наблюдатель — этот параметр, наоборот, помешает повторным запускам.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Мониторинг считает завершение сбоем

    Проверка «служба active» для одноразовой задачи всегда провалится, если не задано сохранение состояния.

  2. Задача по таймеру не запускается повторно

    С сохранением состояния задача остаётся активной, и следующее срабатывание таймера ничего не делает.

  3. Последовательность шагов в одной задаче

    При Type=oneshot допустимо несколько команд запуска, и они выполняются по порядку. Неудача любой останавливает остальные.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Тип, поведение после завершения и код последнего запуска.

systemctl show myapp.service -p Type -p RemainAfterExit -p ExecMainStatus

Правильная проверка для одноразовых задач.

systemctl is-failed myapp.service

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Мониторинг считает завершение сбоем
Почему происходит
Проверка «служба active» для одноразовой задачи всегда провалится, если не задано сохранение состояния.
Как проверить
Посмотрите тип и параметр.
systemctl show myapp.service -p Type -p RemainAfterExit -p SubState
Как исправить
Добавьте RemainAfterExit=yes и проверяйте через systemctl is-failed, а не через is-active.
2. Задача по таймеру не запускается повторно
Почему происходит
С сохранением состояния задача остаётся активной, и следующее срабатывание таймера ничего не делает.
Как проверить
Посмотрите параметр и историю запусков.
systemctl show myapp.service -p RemainAfterExit
systemctl list-timers myapp.timer --no-pager
Как исправить
Уберите сохранение состояния у задач, вызываемых таймером: они должны завершаться.
3. Последовательность шагов в одной задаче
Почему происходит
При Type=oneshot допустимо несколько команд запуска, и они выполняются по порядку. Неудача любой останавливает остальные.
Как проверить
Посмотрите список команд.
systemctl cat myapp.service | grep -c "^ExecStart="
Как исправить
Для шагов, неудача которых допустима, ставьте дефис перед командой. Это точнее, чем прятать ошибки внутри скрипта.

Пример вывода

Задача выполнена, состояние честно это отражает. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

● migrate.service - Применение миграций
     Loaded: loaded (/etc/systemd/system/migrate.service; enabled)
     Active: active (exited) since Mon 2026-09-15 08:00:02 MSK; 6h ago
    Process: 1200 ExecStart=/usr/local/bin/migrate (code=exited, status=0/SUCCESS)

Связанные ошибки

Источники

  • systemd.service(5)
    Type=oneshot, RemainAfterExit= и несколько команд запуска.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Проверено на задаче по таймеру: с сохранением состояния повторные запуски не выполняются.
    собственная проверка, systemd 255
    сверено 15 сентября 2026