1 min read

Как написать свой systemd unit-файл и забыть про ручной запуск скриптов

Как написать свой systemd unit-файл и забыть про ручной запуск скриптов

Пару лет назад я сидел ночью в офисе и перезапускал вручную скрипт для обработки логов. Он падал каждые два часа. Я устал.

Предыстория

У нас был клиентский проект — парсер данных для интернет-магазина. Разработчик написал скрипт на Python, залил на сервер, сказал: «Запусти и забудь».

Я запустил через nohup. Через три часа процесс умер. Никто не заметил. Магазин потерял обновления цен.

Проблема

Скрипты, запущенные вручную, не перезапускаются после сбоя. Они не логируются в системный журнал. Их нельзя стартовать при загрузке системы.

Это приводит к даунтайму. Пока ты спишь — сервис молчит. Клиенты получают устаревшие данные.

Любой скрипт, который работает дольше пяти минут, должен быть оформлен как systemd unit.

Почему это важно

Для бизнеса простой сервиса — прямые убытки. Если парсер цен упал на час, товары не обновляются. Пользователи уходят к конкурентам.

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

Решение

Я разобрался со структурой systemd unit-файла. Вот как это выглядит на практике.

Сам unit-файл лежит в /etc/systemd/system/ с расширением .service. Внутри три основных секции: [Unit] — описание и зависимости, [Service] — как запускать, [Install] — когда включать.

Вот минимальный пример для скрипта на Python:

  • 📄 [Unit] — Description=My parser, After=network.target
  • ⚙️ [Service] — Type=simple, ExecStart=/usr/bin/python3 /opt/parser/main.py, Restart=on-failure
  • 🔗 [Install] — WantedBy=multi-user.target

После создания файла выполняешь systemctl daemon-reload, а потом systemctl enable my-parser.service и systemctl start my-parser.service.

Теперь скрипт стартует при загрузке. Если упадет — systemd перезапустит его автоматически. Все сообщения идут в journalctl.

Результат

Тот парсер цен работает до сих пор без вмешательства. Я просто добавил ещё три похожих сервиса для других клиентов.

Забыл про nohup. Забыл про ps aux и поиск PID. systemd делает всё сам.


📬 Свяжитесь с нами

Хотите внедрить это в своем бизнесе? Пишите нам!

Связаться с нами
Telegram
WhatsApp
Email