Запуском процессов занимается супервизор, процесс, задачей которого является контроль других процессов, их запуск, перезапуск и остановку. Супервизор стартует в системе первым и затем запускает всё остальное по описаниям, которые ему дали. В свою очередь запущенные программы (их процессы) запускают свои процессы. В конечном итоге формируется дерево процессов, которое постоянно изменяется. Его можно вывести командой ps auxf
:
# Урезанный вывод
# Вложенность указывает на то, кто кого запустил
root 1 /sbin/init # супервизор
root 167311 tmux -CC
root 594643 \_ -zsh
root 594719 | \_ make app-bash
root 594727 | \_ docker-compose run --rm web bash
root 594728 | \_ docker-compose run --rm web bash
root 594747 | \_ /usr/bin/docker start --attach --interac
root 595271 \_ -zsh
root 599249 \_ -zsh
root 599310 \_ nvim
Супервизор – такая же программа, как и всё остальное. Причём супервизоры бывают разные и могут меняться. На текущий момент в большинстве Linux дистрибутивов используется systemd. Ниже пример файла, описывающего как запустить процесс программы Nginx с помощью Systemd:
# Пример описания для веб-сервера Nginx
# /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Обычно такие файлы поставляются прямо с программами, но иногда их нужно делать самостоятельно. Systemd – гибкая система, позволяющая не только задавать правила старта, но и ограничивать ресурсы процессов, например, ставить лимиты по памяти или процессу.
Кроме того, systemd собирает логи со всех запущенных процессов. Для этого каждый процесс, контролируемый systemd, должен выводить свои логи в STDOUT. Затем их можно просматривать с помощью утилиты journalctl:
# Выведет логи nginx
journalctl -u nginx.service
Самостоятельная работа
На практике часто возникает необходимость сделать так, чтобы какой-то сервис возобновлял свою работу после перезагрузки системы. Для этого, как вы уже догадались, используется супервизор. Давайте поэкспериментируем с systemd и сделаем автозагрузку веб-сервера, который мы запускали в уроке «Файловая система».
В каталоге /lib/systemd/system создайте файл в котором будет описан сервис
Проверьте чтобы у файла были права 644
Запустите сервис и проверьте, что он работает
Откройте страницу в браузере. На экране должна быть строка: «Hello, Hexlet!»
Включите автозагрузку для сервиса веб-сервера
Перезагрузите систему. Выведите статус и убедитесь что сервис стартовал автоматически
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.