Systemd - это мощная система инициализации и диспетчер служб для операционных систем Linux, созданная для оптимизации и упрощения управления различными системными компонентами и службами.
Углубляться в мануал и различные варианты использования я не буду, я пошагово опишу как ее использовать на практике для конкретной задачи, в моем случае это автоматизация запуска Python приложений.
И так предположим у вас уже есть приложение на Python, отладку оно прошло и нужно запускать в production, но docker использовать либо не хотим, либо он не нужен из за пары небольших сервисов. Тут как раз нам и приходят на помощь Systemd сервисы.
Создание сервиса
Для начала перейдем рабочую директорию (в любую), где вы привыкли работать например /home/user :
cd /home/user
Далее с помощью редактора nano создадим файл сервиса telegram-bot.service, у вас он может иметь любо значение name.service в зависимости от вашей задачи:
nano telegram-bot.service
telegram-bot.service:
[Unit]
Description=Telegram bot 1
After=network.target
[Service]
Type=simple
WorkingDirectory=/var/www/tb1
ExecStart=/bin/python3 /var/www/tb1/main.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Основные моменты:
Description=Telegram bot 1 - описание для нашего сервиса
WorkingDirectory=/var/www/tb1 - рабочая директория нашего приложения
ExecStart=/bin/python3 /var/www/tb1/main.py - указываем кому и что запускать, в данном случае говорим питону запустить main.py
Restart=always - перезапускать всегда, когда сервис был остановлен, например после перегрузки сервера.
Далее копируем наш файл telegram-bot.service в /etc/systemd/system/ и устанавливаем права на файл:
cp telegram-bot.service /etc/systemd/system/telegram-bot.service
chmod 664 /etc/systemd/system/telegram-bot.service
Переходим в рабочую директорию сервисов и перечитатываем изменения:
cd /etc/systemd/system/
systemctl daemon-reload
Активируем и запускаем наш сервис:
systemctl enable /etc/systemd/system/telegram-bot.service
systemctl start telegram-bot.service
Проверяем работу сервиса:
systemctl status telegram-bot.service
Если вы все сделали правильно то увидите что сервис активный и работает без ошибок:
Если остались вопросы или замечания по теме, можете писать в комментарии.
WorkingDirectory=/var/www/tb1 - рабочая директория, которую в следующей команде игнорируете, указывая полный путь.
Restart=always совсем не для того нужен. Ведь вы заенаблили сервис и при перезагрузке сервера он и так запустится.
Если Вы привыкли постоянно работать из под рута, то да, вы легко скопируете файл в /etc/systemd/system, но это вопиющая безграмотность и наплевательство на безопасность.
Раз уж в команде systemctl enable /etc/systemd/system/telegram-bot.service указываете полный путь, то почему бы не заенаблить сразу из каталога пользователя?
Ах да! У вас же WantedBy=multi-user.target, но почему-то сервис туда не стал.
В обСЧем кулхаЦкер, удачи Вам! И успешных наступаний на собственные грабли.
Спасибо за конструктивную критику, статью поправлю