Как создать systemd unit для своего скрипта: пошаговый гайд
Пошаговое руководство по созданию, настройке и управлению systemd-юнитом для скрипта на Linux
Введение
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.targetDescription— краткое описание.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. Следуя шагам, вы сможете автоматизировать запуск, настроить перезапуск при сбоях и легко управлять службой. Не забывайте проверять логи и тестировать конфигурацию. Удачи!
Читайте также
Комментарии
Комментарии доступны только зарегистрированным пользователям. Войти
- Пока нет комментариев. Будьте первым.



