Как в Linux пользоваться systemctl и systemd

Обновлено Обновлено: Опубликовано Опубликовано:

Вместе с подсистемой systemd появилась команда systemctl. Она позволяет управлять основными процессами Linux. Ниже представлена небольшая инструкция в виде шпаргалки наиболее используемых команд.

Общий синтаксис

Без параметров, systemctl показывает список запущенных служб, точек монтирования, устройств и других юнитов.

# systemctl

Примерный вывод команды:

Вывод команды systemctl

1) название юнита;
2) тип юнита (например, service: служба или демон, mount: точка монтирования, device: устройства);
3) состояние юнита (загружен или нет);
4) обобщенный статус юнита (active: выполняется, inactive: не был запущен, maintenance: требуется внимание администратора);
5) текущий статус (запущен или нет);
6) описание.

Шпаргалка по часто используемым командам systemctl

1. Посмотреть статус службы:

systemctl status network

* покажет статус службы на примере сети network

2. Запустить сервис:

systemctl start mysql

* запустит сервис баз данных на примере mysql

3. Остановить службу:

systemctl stop ntpd

* остановит сервис времени ntpd

4. Перезапустить службу:

systemctl restart nginx

* перезапустит веб-сервер nginx

5. Включить автозапуск службы:

systemctl enable apache

* разрешит автозапуск веб-сервера apache

6. Отключить автозапуск службы:

systemctl disable firewalld

* запретит автозапуск брандмауэра firewalld

7. Показать список всех юнитов:

systemctl list-units

Для удоства, можно фильтровать по типу:

systemctl list-units --type=service

systemctl list-units --type=timer

systemctl list-units --type=socket

8. Выполнить команду на удаленной системе:

systemctl --host root@192.168.0.15 stop cron

* остановит cron на компьютере с IP-адресом 192.168.0.15, подключившись под учетной записью root.

9. Перезагрузить сервер:

systemctl reboot

* перезагрузит локальный сервер.

10. Проверка работы сервиса.

Выполняется с помощью опции is-active:

systemctl is-active docker

* в данном примере мы проверим работу службы docker.

а) Если сервис запущен, мы увидим:

active

б) Если не запущен:

failed

... или:

inactive

в) Если такого сервиса нет в системе:

unknown

... или:

inactive

Если сервис не работает или его нет в системе, команда вернет код ошибки, таким образом конструкция:

systemctl is-active docker && docker run hello-world

... приведет к выполнению команды docker run hello-world только в том случае, если сервис docker работает.

Создание сервиса

В подсистеме systemd также можно легко создать собственную службу и использовать ее для автозапуска приложений или собственных скриптов. Для этого в каталоге /usr/lib/systemd/system создаем юнит (файл) с расширением .service.

Пример простой и частоиспользуемой конфигурации:

[Unit]
Description=Service Name
After=network.target

[Service]
User=root
Group=root
Type=simple

ExecStart=/usr/bin/myapp
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

* как правило, файл разделен на 3 части:

  • Unit — позволяет определить метаданные для юнита.
  • Service — раздел для основной конфигурации юнита.
  • Install — определение поведения для юнита при его включении или отключении.

Подробнее можно почитать о структуре и возможных опциях на странице https://linux-notes.org/pishem-systemd-unit-fajl/

Более сложный вариант разберем на примере сервиса bind:

vi /usr/lib/systemd/system/named.service

Содержимое может быть следующего содержания:

[Unit]
Description=Berkeley Internet Name Domain (DNS)
Wants=nss-lookup.target
Wants=named-setup-rndc.service
Before=nss-lookup.target
After=network.target
After=named-setup-rndc.service

[Service]
Type=forking
Environment=NAMEDCONF=/etc/named.conf
EnvironmentFile=-/etc/sysconfig/named
Environment=KRB5_KTNAME=/etc/named.keytab
PIDFile=/run/named/named.pid
ExecStartPre=/bin/bash -c 'if [ ! "$DISABLE_ZONE_CHECKING" == "yes" ]; then /usr/sbin/named-checkconf -z "$NAMEDCONF"; else echo "Checking of zone files is disabled"; fi'
ExecStart=/usr/sbin/named -u named -c ${NAMEDCONF} $OPTIONS
ExecReload=/bin/sh -c '/usr/sbin/rndc reload > /dev/null 2>&1 || /bin/kill -HUP $MAINPID'
ExecStop=/bin/sh -c '/usr/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID'
PrivateTmp=true

[Install]
WantedBy=multi-user.target

После внесения изменений и сохранения файла, необходимо перечитать изменения командой:

systemctl daemon-reload

Теперь можно разрешить автозапуск:

systemctl enable named

Редактирование сервисов

Если мы хотим внести изменения в юнит-файл сервиса, который был установлен с последним, необходимо использовать drop-in файл или файл переопределения настроек. В противном случае, после обновления программы наши изменения могут быть удалены.

И так, мы для примера взяли юнит для bind. Чтобы создать для него drop-in файл, вводим:

systemctl edit named

И вносим, например, такие изменения:

[Service]
Restart=on-failure

* будет создан файл /etc/systemd/system/named.service.d/override.conf, который будет переопределять настройки основного юнит-файла. В данном примере, мы указываем на необходимость перезапуска сервиса при сбое.

Чтобы убедиться в использовании Drop-In файла смотрим статус сервиса:

systemctl status named

Мы должны увидеть что-то на подобие:

Drop-In: /etc/systemd/system/named.service.d
           — override.conf

Также мы можем редаетировать файл юните без drop-in. Для этого добавляем опцию full:

systemctl edit --full named

Однако, как было сказано выше, при очередном обновлении приложения, если разработчик пакета предоставляет файл systemd наши изменения могут быть перетерты.

Таймеры

Выше мы рассмотрели возможность автоматического запуска сервисов с помощью systemd. Мы также можем настроить периодический запуск данных юнитов по таймеру. Для этого нам нужно создать юнит с таким же названием, но на конце должен быть суффикс .timer.

Предположим, мы хотим создать запуск по таймеру named, для которого выше в примере создали юнит сервиса. Тогда создаем файл:

vi /usr/lib/systemd/system/named.timer

[Unit]
Description=Run named every 10 min

[Timer]
OnBootSec=5min
OnUnitActiveSec=10min

[Install]
WantedBy=timers.target

* в данном примере наш таймер будет создан для юнита named; он запустится через 5 минут после старта службы и будет запускать ее каждые 10 минут.

Перечитаем изменения в systemd:

systemctl daemon-reload

Разрешаем наш таймер:

systemctl enable named.timer

Запустим его:

systemctl start named.timer

Вывести список таймеров можно командой:

systemctl list-timers

Теймеры, как замена cron

Также мы можем написать юниты, которые будут запускаться в определенное время, аналогично cron. В отличие от последнего, такие задания не будут стартовать, пока работает предыдущий экземпляр — это может быть полезно, если интервалы между запусками небольшие.

Для начала, напишем небольшой юнит для запуска задания. Для удобства, определим переменную с названием сервиса:

SRV_NAME=update-app

Создаем файл:

vi /usr/lib/systemd/system/${SRV_NAME}.service

[Unit]
Description=Update Application Oneshot Service

[Service]
Type=oneshot
User=root
Group=root
ExecStart=/scripts/update-app.sh
SyslogIdentifier=update-app

* в данном примере мы планируем запускать скрипт по пути /scripts/update-app.sh. Обратите внимание, что мы указали значение SyslogIdentifier, чтобы по нему проще было искать событие в журнале командой journalctl.

Теперь, как описано, чуть, выше, создаем файл для таймера:

vi /usr/lib/systemd/system/${SRV_NAME}.timer

[Unit]
Description=Update Application Timer

[Timer]
OnCalendar=*-*-* 03:00:00
AccuracySec=1m
Persistent=true

[Install]
WantedBy=timers.target

* где:

  • OnCalendar — указывает, в какие дни и в какое время должен запускаться сервис. В нашем примере каждый день в 03:00.
  • AccuracySec — допустимая погрешность (1 минута).
  • Persistent — запустить задачу при пропуске (например, если сервер был выключен).

Разрешаем задание по созданному таймеру и запустим его:

systemctl enable ${SRV_NAME}.timer

systemctl start ${SRV_NAME}.timer

Вывести информацию о созданном таймере можно командой:

systemctl list-timers ${SRV_NAME}.timer

Или посмотреть состояние таймера:

systemctl status ${SRV_NAME}.timer

# Linux # UNIX # Операционные системы # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет

Дмитрий Моск
— IT-специалист.
Настройка серверов, услуги DevOps.

Нужна бесплатная консультация?

Мини-инструкции

Как поменять имя компьютера Windows

Настройка удаленного рабочего стола

Как настроить теневые копии Windows

Как пользоваться командой systemctl

Установка и настройка DFS с помощью Powershell

Как установить и настроить DFS

Как в Excel сгенерировать числовые пароли

Другие инструкции

Все статьи

Нужна помощь? Пишите:






Реклама