systemctl и systemd в Linux

  • Михаил
  • 12 мин. на прочтение
  • 144
  • 31 Jan 2013
  • 31 Jan 2013

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

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

systemctl

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

 

НАПРИМЕР

sysinit.target                                                              loaded active active    System Initialization

  • sysinit название юнита;
  • target тип юнита (например, service: служба или демон, mount: точка монтирования, device: устройства);
  • loaded состояние юнита (загружен или нет);
  • active обобщенный статус юнита (active: выполняется, inactive: не был запущен, maintenance: требуется внимание администратора);
  • active текущий статус (запущен или нет);
  • System Initialization описание.

 

Часто используемым командам systemctl

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

systemctl status nginx

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

systemctl start nginx

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

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

systemctl stop nginx

* остановит сервис веб-сервера nginx

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

systemctl restart nginx

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

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

systemctl enable nginx

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

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

systemctl disable nginx

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

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

systemctl --host root@10.10.0.10 stop cron

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

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

systemctl reboot

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

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

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

systemctl is-active nginx

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

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

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

failed

... или:

inactive

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

unknown

... или:

inactive

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

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

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

 

Автозапуск

Подсистему systemd также можно использовать для автозапуска сервисов или скриптов. Для этого в каталоге /usr/lib/systemd/system создаем юнит (файл) с расширением .service. Подробнее разберем на примере сервиса 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

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

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

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

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

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

 

Таймеры

Выше мы рассмотрели возможность автоматического запуска сервисов с помощью 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