systemd oneshot сервисы
Тема дорожной карты · Bash
Одноразовая служба systemd — тип юнита (Type=oneshot), предназначенный для выполнения скрипта или команды до завершения с последующим выходом, а не для поддержания долго работающего процесса-демона, что делает его естественной точкой интеграции systemd для Bash-скриптов автоматизации, выполняющих разовые задачи, такие как инициализация системы, применение конфигурации или миграция баз данных. Установка RemainAfterExit=yes в юнит-файле вместе с Type=oneshot позволяет systemd считать службу «активной» после завершения скрипта, что позволяет другим юнитам зависеть от неё через директивы After= и Requires=. Директива ExecStart в одноразовом юните обычно указывает на Bash-скрипт с #!/usr/bin/env bash и set -euo pipefail в начале, обеспечивая отображение сбоев как сбоев службы systemd, а не их молчаливую передачу. Использование ExecStartPre для предварительных проверок и ExecStop или ExecStopPost для очистки в одноразовом юните — рекомендуемая практика автоматизации Linux, которая сохраняет операционную логику внутри shell-скрипта, одновременно используя граф зависимостей systemd и журналирование в journald. Одноразовые службы systemd соединяют традиционные Bash-скрипты на основе cron с современным управлением службами Linux.
Как это работает
systemd oneshot сервисы: распространённые паттерны — ежедневные cron-задания, ротация логов, backup-скрипты, deployment-автоматизация, service health-check, system-level клей между unix-тулами. Комбинируйте с systemd (.service + .timer units) вместо cron, когда нужны логи + restart-on-failure + зависимости. Расписание: cron (просто), systemd timers (современнее + интегрировано), Ansible (multi-host).
Когда применять
Bash — для "связать эти тулы вместе" автоматизации (rsync + tar + ssh + email). Переходите на Ansible/Python/Go, когда скрипт растёт за ~200 строк, требует структурированных данных или multi-host координации. Всегда логируйте в syslog или файл с timestamps — сбои диагностируемы.
Типичные ошибки
Ловушки systemd oneshot сервисы: cron без логирования (job падает 6 месяцев, никто не замечает); скрипты с расчётом, что PATH такой же, как в вашем shell (cron имеет минимальный env — задавайте PATH явно); root-owned скрипты, зовущиеся из www-data через sudo NOPASSWD (privesc-поверхность — минимизируйте sudoable).