Всем привет! Недавно на своем сервере запустил сокеты и через определенный промежуток времени стал замечать что они работают не стабильно. То и дело приходилось заходить на сервер и перезапускать их, так как падал процесс. Следовательно ситуация требовала автоматизированного решения. Нужно было сделать так, чтобы процесс при падении перезапускался автоматически. И я стал искать решение! Зайдя в 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С вами был Грибин Андрей. Удачи!