systemd в Ubuntu используются также как в других современных дистрибутивах: Debian, CentOS.
systemd позволяет управлять сервисами, отслеживать процессы и обеспечивать простое логирование. Рассмотрим возможности systemd и основы работы с системой.
systemd скрипты в Ubuntu
Информация о состоянии системы
systemd оперирует unit-ами среди которых есть сервисы (или .service, наряду с .socket, .device, .mount, .automount, .swap, .target и т.д.).
Те из них, что находятся в статусе 'active' вывести можно следующим образом (здесь и далее на примере Nginx)
systemctl list-units | grep nginx
nginx.service loaded active running A high performance web server and a reverse proxy server
Все закруженные unit-ы можно вывести добавив флаг --all
systemctl list-units --all
Полный список, учитывая сервисы которые загрузить попыток не предпринималось
systemctl list-unit-files
Unit-файлы
Sysetmd использует Unit-ы, параметры каждого из которых можно менять. Просмотреть файл Nginx можно так:
systemctl cat nginx.service
# /lib/systemd/system/nginx.service
# Stop dance for nginx
# =======================
[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon —quiet —stop —retry QUIT/5 —pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
Файл содержит три секции с директивами, значения которых при необходимости можно менять.
Секции [Unit] и[Service] с их директивами интуитивно понятны.
В секции [Install] прописывается target, в зависимости от которого находится сервис. Любое значение фактически означает добавление в автозапуск.
При старте каждого сервиса задействуются определенные зависимости, которые можно вывести в виде дерева
systemctl list-dependencies nginx.service
nginx.service
● ├─system.slice
● └─sysinit.target
● ├─proc-sys-fs-binfmt_misc.automount
● ├─systemd-hwdb-update.service
…
Добавив к последней команде флаг --all
можно просмотреть также зависимости зависимостей.
Подробная информация по сервису со значениями всех используемых параметров
systemctl show nginx.service
Type=forking
Restart=no
PIDFile=/run/nginx.pid
NotifyAccess=none
RestartUSec=100ms
TimeoutStartUSec=1min 30s
TimeoutStopUSec=5s
RuntimeMaxUSec=infinity
WatchdogUSec=0
WatchdogTimestamp=Thu 2018-07-19 16:08:42 UTC
WatchdogTimestampMonotonic=10688305
FailureAction=none
PermissionsStartOnly=no
RootDirectoryStartOnly=no
…
Изменение Unit-файлов
systemctl используется для внесения любых изменений, редактирование файлов вручную как это делается с SysV и Upstart не требуется
systemctl edit --full nginx.service
Без ключа --full
можно создать сниппет, т.е. добавить к файлу директивы не редактируя его целиком. Откроется пустой документ. При написании нужных директив и сохранении будет добавлен /etc/systemd/system/nginx.service.d — такой же файл можно создать вручную.
Когда изменения внесены требуется перезагрузить демон
systemctl daemon-reload
Targets и переход между Runlevel-ами
target-ы в systemd — точки, перехода между состояниями или runlevel-ами, к которым привязываются unit-ы. Если runlevel может использоваться в определенный момент времени только один, target-ы могут быть активны одновременно в нескольких экземплярах.
Просмотреть активные и доступные в системе:
systemctl list-unit-files --type=target
..
runlevel0.target disabled
runlevel1.target disabled
runlevel2.target static
runlevel3.target static
runlevel4.target static
runlevel5.target static
Среди прочего здесь можно увидеть привычные runlevel-ы
systemctl get-default
graphical.target
get-default выводит target, к которому происходит обращение при загрузке, он выстраивает дерево зависимостей и стартует все unit-ы.
Его при необходимости есть возможность поменять
systemctl set-default multi-user.target
Можно посмотреть какие unit-ы привязаны к target-у
systemctl list-dependencies multi-user.target
multi-user.target
● ├─apache2.service
● ├─cron.service
● ├─mariadb.service
..
systemd скрипты и остановка/перезагрузка сервера
Выключение машины
systemctl poweroff
Перезагрузка
systemctl reboot
Режим восстановления
systemctl rescue
На этом всё, мы рассмотрели основы работы с systemd в Ubuntu.
В systemd есть своя утилита, позволяющая работать с логами — journald, читайте про неё
Также читайте про управление сервисами через systemctl и смотрите пример добавления своего сервиса systemd на примере приложения на nodejs.