Блог веб разработки статьи | видеообзоры | исходный код

Блог веб разработки статьи | видеообзоры | исходный код

webfanat вконтакте webfanat youtube

linux systemd

linux systemd

Всем привет! Недавно на своем сервере запустил сокеты и через определенный промежуток времени стал замечать что они работают не стабильно. То и дело приходилось заходить на сервер и перезапускать их, так как падал процесс. Следовательно ситуация требовала автоматизированного решения. Нужно было сделать так, чтобы процесс при падении перезапускался автоматически. И я стал искать решение! Зайдя в google была найдена куча информации. В большинстве случаев на сервер требовалось устанавливать дополнительные утилиты и программы. Честно, не хотелось засорять свой сервер сторонним софтом и я еще углубился в поиск. В конечном итоге я узнал про подсистему инициализации systemd linux. Это по сути демон для запуска других демонов. Он входит в стандартные пакеты linux и поэтому его не нужно дополнительно устанавливать. Именно работу systemd мы сегодня рассмотрим. Погнали!

Показывать работу буду на примере дистрибутива ubuntu.

И так, для начала приведем пример с процессом который хотим перезапускать при падении.

В качестве примера возьму сервер написанный на python.

python3 /opt/lampp/htdocs/test/server.py & exit

C помощью этой команд я запускаю сервер и сразу же выхожу из терминала.

Затем нахожу процесс через команду.

ps ax

И намерено убиваю его.

kill -9 <pid>

После повторной проверки процесса, как вы наверное догадались, его уже не будет. Здесь было эмитировано падение сервера.

Наша задача сделать чтобы процесс после завершения автоматически был вновь запущен.

Переходим к работе с systemd! Создаем сервис.

Заходим по такому пути /etc/systemd/system

cd /etc/systemd/system

Здесь нам необходимо создать файл с расширением service. Это будет так называемый сервис. Допустим назовем его server-python.

sudo gedit server-python.service

Для создания я использую текстовый редактор gedit.

Содержимое файла:

[Unit] Description=Python start server After=network.target
[Service]
Type=simple
User=root
Group=root
ExecStart=/usr/bin/server.py
Restart=always

[Install]
WantedBy=multi-user.target

Из всего нас пока интересуют два параметра Description - описание и ExecStart - путь к исполняемому файлу который будет запускаться при падении процесса.

В описании вы просто описываете сервис, к примеру я написал "Python start server". В параметре ExecStart пишите путь до исполняемого файла.

Systemd позволяет запускать только исполняемые файлы. Поэтому файл server.py нам необходимо перенести в директорию /usr/bin/ и сделать исполняемым.

Чтобы файл py сделать исполняемым необходимо добавить в самое его начало строчку

#!/usr/bin/env python3

Затем перенести или копировать в папку /usr/bin.

sudo cp server.py /usr/bin

И сделать исполняемым.

sudo chmod +x /usr/bin/server.py

В результате проделанной работы мы сможем запускать сервер одной командой server.py

server.py

Для того чтобы запускать сервер через systemd надо указать полный путь до файла.

В моем случае это /usr/bin/server.py. Этой командой ExecStart=/usr/bin/server.py будет перезапускаться сервер при падении. Команда уже прописана в нашем файле server-python.service

Теперь нам остается только инициализировать и запустить сервис.

Для инициализации используется данная команда

systemctl enable server-python

где server-python название сервиса(server-python.service). Инициализацию нужно выполнять каждый раз когда вы внесете изменения в файл server-python.service.

Запуск сервиса.

systemctl start server-python

Если после выполнения этой команды ошибок не выводятся ошибки, значит сервис успешно запущен.

Для проверки попробуем снова найти и завершить процесс.

В конечной итоге сколько бы мы не завершали процесс. Он будет в автоматическом режиме перезапущен. Даже при перезагрузке всего сервера. Это очень удобно когда на сервере вы запускаете процесс и хотите полностью контролировать время его работы.

Для остановки сервиса используется команда stop.

systemctl stop server-python

Работа сервиса остановится.

systemctl restart server-python

После данной команды сервис перезапуститься. Заметьте что все выполняемые команды systemd требуют ввода пароля супер пользователя.

Наша задача выполнена и теперь вы знаете как можно автоматически перезапускать процессы в linux при их падении.

Конечно мы рассмотрели лишь малую часть всех возможностей systemd, возможно еще будут посты по этой теме.

Не забывайте оставлять свои комментарии и вопросы. Подписывайтесь на мой

блог группу вк канал youtube

С вами был Грибин Андрей. Удачи!

Оцените статью:

Статьи

Комментарии

Внимание!!! Комментарий теперь перед публикацией проходит модерацию

Все комментарии отправлены на модерацию

Реклама

Запись экрана

Данное расширение позволяет записывать экран и выводит видео в формате webm