sadrix logoSadriX
Минцифры готовит обязательную регистрацию IMEI смартфонов, купленных за границей
Гайды

Как создать systemd unit для своего скрипта: пошаговый гайд

Пошаговое руководство по созданию, настройке и управлению systemd-юнитом для скрипта на Linux

02 932 просмотров3 мин
0
Поделиться:TelegramVK

Введение

Systemd — это система инициализации и менеджер служб, используемая в большинстве современных Linux-дистрибутивов. Она позволяет автоматически запускать программы при загрузке системы, перезапускать их при сбоях и управлять ими с помощью единого интерфейса. Если у вас есть скрипт (на Bash, Python, Node.js и т.д.), который должен работать в фоне как служба, лучший способ — создать для него systemd unit. В этом руководстве мы подробно разберём, как это сделать: от написания unit-файла до включения автозапуска и отладки.

Требования

  • Linux-система с systemd (Ubuntu, Debian, CentOS, Fedora, Arch и др.).

  • Права суперпользователя (sudo).

  • Скрипт, который вы хотите запускать как службу. Убедитесь, что он имеет shebang (например, #!/bin/bash) и права на выполнение.

  • Базовые навыки работы с командной строкой.

Шаг 1: Подготовьте скрипт

Прежде чем создавать unit, убедитесь, что ваш скрипт работает корректно при ручном запуске. Проверьте:

  • Наличие shebang в первой строке.

  • Права на выполнение: chmod +x /path/to/your_script.sh.

  • Все зависимости установлены.

  • Скрипт не требует интерактивного ввода (systemd не поддерживает stdin).

Рекомендуется разместить скрипт в стандартном месте, например /usr/local/bin/, чтобы он был доступен по абсолютному пути.

Шаг 2: Создайте unit-файл

Unit-файлы для служб обычно находятся в /etc/systemd/system/. Создайте файл с расширением .service, например:

sudo nano /etc/systemd/system/my_script.service

Имя файла может быть произвольным, но лучше отражать суть службы.

Шаг 3: Заполните секцию [Unit]

В секции [Unit] указывается описание службы и её зависимости. Пример:

[Unit]
Description=My Custom Script Service
After=network.target
  • Description — краткое описание.

  • After=network.target — запускать службу после настройки сети. Если ваш скрипт не требует сети, эту строку можно опустить.

Шаг 4: Настройте секцию [Service]

Секция [Service] определяет, как запускать процесс. Основные параметры:

[Service]
Type=simple
ExecStart=/usr/local/bin/my_script.sh
Restart=on-failure
User=myuser
Group=mygroup
WorkingDirectory=/opt/myapp
Environment="VAR=value"
  • Type=simple — для процессов, которые не демонизируются (большинство скриптов).

  • ExecStart — полный путь к исполняемому файлу.

  • Restart=on-failure — перезапускать при аварийном завершении.

  • User и Group — от имени какого пользователя запускать (рекомендуется не root).

  • WorkingDirectory — рабочая директория.

  • Environment — переменные окружения.

Для скриптов, которые сами демонизируются, используйте Type=forking, но это редкость.

Шаг 5: Добавьте секцию [Install]

Секция [Install] определяет, как служба включается в автозапуск:

[Install]
WantedBy=multi-user.target

Это означает, что служба будет запущена при загрузке в многопользовательском режиме (обычный режим работы).

Шаг 6: Перезагрузите конфигурацию systemd

После создания или изменения unit-файла выполните:

sudo systemctl daemon-reload

Это заставит systemd перечитать все unit-файлы.

Шаг 7: Запустите службу и проверьте статус

Запустите службу:

sudo systemctl start my_script.service

Проверьте статус:

sudo systemctl status my_script.service

Вы должны увидеть active (running). Если нет — изучите вывод, там будут ошибки.

Шаг 8: Включите автозапуск

Чтобы служба запускалась при загрузке системы:

sudo systemctl enable my_script.service

Теперь можно перезагрузиться и проверить.

Шаг 9: Управляйте службой

Основные команды:

  • sudo systemctl stop my_script.service — остановить.

  • sudo systemctl restart my_script.service — перезапустить.

  • sudo systemctl disable my_script.service — отключить автозапуск.

  • sudo systemctl is-enabled my_script.service — проверить, включён ли автозапуск.

Шаг 10: Просмотр логов

Логи службы можно смотреть через journalctl:

sudo journalctl -u my_script.service -f

Ключ -f позволяет следить за логами в реальном времени.

Типичные ошибки

1. Скрипт не выполняется — проверьте права на выполнение и shebang. 2. Служба не запускается — смотрите systemctl status и journalctl. Часто причина в неверном пути в ExecStart. 3. Отсутствует daemon-reload — после изменения unit-файла всегда выполняйте sudo systemctl daemon-reload. 4. Неверный Type — для простых скриптов используйте Type=simple. Если скрипт форкается, но не демонизируется, попробуйте Type=forking. 5. Проблемы с правами — если служба запускается от пользователя, убедитесь, что у него есть доступ к файлам и директориям. 6. Сеть недоступна — добавьте After=network.target или After=network-online.target.

FAQ

В: Можно ли запускать скрипт от имени другого пользователя? О: Да, укажите User=username в секции [Service].

В: Как передать переменные окружения? О: Используйте Environment или EnvironmentFile для файла с переменными.

В: Что делать, если скрипт должен работать постоянно и перезапускаться при падении? О: Установите Restart=always и RestartSec=5 (задержка перед перезапуском).

В: Где хранить unit-файлы? О: Системные службы — в /etc/systemd/system/, пользовательские — в ~/.config/systemd/user/ (для запуска от пользователя без root).

В: Как удалить службу? О: Остановите, отключите автозапуск, удалите файл и выполните daemon-reload.

Итог

Создание systemd unit для скрипта — это стандартный и надёжный способ организовать фоновую работу программы в Linux. Следуя шагам, вы сможете автоматизировать запуск, настроить перезапуск при сбоях и легко управлять службой. Не забывайте проверять логи и тестировать конфигурацию. Удачи!

Читайте также

Комментарии

Комментарии доступны только зарегистрированным пользователям. Войти

  • Пока нет комментариев. Будьте первым.