systemd скрипты: просмотр и редактирование

systemd скрипты используются для управления сервисами по умолчанию в основных современных дистрибутивах — прежде всего в Debian 8+ и Ubuntu16+. systemd позволяет отслеживать процессы и обеспечивать просто

 

systemd скрипты

 

Информация о состоянии системы

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

 
systemd скрипты
 

Unit-файлы

Sysetmd использует Unit-ы, праметры каждого из которых можно менять. Просмотреть файл Nginx можно так:

 

systemctl cat nginx.service

# /lib/systemd/system/nginx.service
# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (—retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[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
● ├─dev-hugepages.mount
● ├─dev-mqueue.mount
● ├─kmod-static-nodes.service
● ├─proc-sys-fs-binfmt_misc.automount
● ├─sys-fs-fuse-connections.mount
● ├─sys-kernel-config.mount
● ├─sys-kernel-debug.mount
● ├─systemd-ask-password-console.path
● ├─systemd-binfmt.service
● ├─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
● ├─atop.service
● ├─atopacct.service
● ├─cgmanager.service
● ├─cgproxy.service
● ├─cron.service
● ├─dbus.service
● ├─disable-thp.service
● ├─mariadb.service

..

 

 

 

systemd скрипты и остановка/перезагрузка сервера

Выключение машины

systemctl poweroff

 

Перезагрузка

systemctl reboot

 

Режим восстановления

systemctl rescue

 

В systemd есть своя утилита, позволяющая работать с логами — journald

Также читайте про управление сервисами через systemctl.