systemctl и systemd в Linux
Вместе с подсистемой 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
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.