Администрирование Linux

Теория: Супервизор

Запуском процессов занимается супервизор, процесс, задачей которого является контроль других процессов, их запуск, перезапуск и остановку. Супервизор стартует в системе первым и затем запускает всё остальное по описаниям, которые ему дали. В свою очередь запущенные программы (их процессы) запускают свои процессы. В конечном итоге формируется дерево процессов, которое постоянно изменяется. Его можно вывести командой 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

Рекомендуемые программы