Краткое руководство по управлению системными службами в Linux

Управление системными службами чаще всего осуществляется системными администраторами, но иногда должно осуществляться и обычными пользователями. Без сомнения, замена SysV (команды service и chkconfig) на systemd (команда systemctl) вызвала достаточно неоднозначную реакцию пользователей и администраторов. В результате у обоих систем остались свои приверженцы.

На сегодняшний день подавляющее большинство дистрибутивов использует systemd для управления системными службами. По этой причине стоит уметь пользоваться командой systemctl.

Я не считаю, что каждый из пользователей может самостоятельно разобраться со всеми нюансами использования рассматриваемого инструментария. По этой причине я постараюсь объяснить все нюансы, связанные с командой systemctl, максимально простыми словами. В конце будет подведены итоги и даны советы по использованию тех или иных подкоманд.

Примечание: на man-странице systemctl первым параметром является «команда», что может смутить неискушенного пользователя. Я буду называть командой саму команду systemctl, а ее первый параметр - подкомандой. Вторым параметром команды является имя системной службы.

Синтаксис команды:

# systemctl подкоманда системная-служба

В качестве примера я буду использовать службу cron:

# systemctl status cron

Информация о состоянии системных служб

При диагностике работы системы следует начинать с получения информации о состоянии важных системных служб. Самым простым решением данной задачи является использование подкоманды status:

# systemctl status cron
● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2020-10-29 17:37:29 MSK; 1h 35min ago
       Docs: man:cron(8)
   Main PID: 915 (cron)
      Tasks: 1 (limit: 4612)
     Memory: 2.9M
     CGroup: /system.slice/cron.service
             └─915 /usr/sbin/cron -f

окт 29 18:17:02 layla CRON[5644]: pam_unix(cron:session): session closed for user root
окт 29 18:30:01 layla CRON[7293]: pam_unix(cron:session): session opened for user root by (uid=0)
...

Разумеется, вы можете использовать другие имена системных служб, которые можно получить с помощью команды:

# systemctl --no-pager | grep service

Обратите внимание на количество дополнительной информации о службе: описание, путь к service-файлу и время загрузки, состояние идентификатор процесса (PID), а также диагностические сообщения.

Команда systemctl status также весьма полезна для выяснения причин неработоспособности тех или иных системных механизмов. При диагностике систем я первым делом проверяю состояние основных системных служб с помощью systemctl. Зачем беспокоится о межсетевых экранах, SELinux/Apparmor или файлах конфигурации, если необходимая служба даже не запущена?

Что же, теперь вы знаете, как получить информацию о состоянии системной службы, такой, как cron. Но как изменить само это состояние?

Запуск и остановка системных служб

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

# service cron restart

В случае systemd для этой цели используется команда systemctl. К примеру, для перезапуска системной службы cron с помощью systemctl следует выполнить следующую команду:

# systemctl restart cron

На мой взгляд, данный синтаксис более очевиден. Для того, чтобы остановить или запустить системную службу, следует использовать соответствующий синтаксис и подкоманды stop и start соответственно, например:

# systemctl stop cron
# systemctl start cron

Службы, которые не прекращают работу после использования подкоманды stop, могут быть остановлены принудительно с помощью подкоманды kill. Например, для принудительной остановки службы cron следует использовать следующую команду:

# systemctl kill cron

Перезагрузка конфигурации системной службы работает немного по-другому. Подкоманда reload просто сообщает системной службе о необходимости повторного чтения содержимого файла конфигурации, в отличие от команды restart, которая останавливает и снова запускает ее, в результате чего также читается обновленное содержимое файла конфигурации.

Например, если вы используете команду systemctl restart cron, планировщик будет полностью перезапущен. В то же время, при перезагрузке конфигурации ему будет отправлен соответствующий сигнал. В обоих случаях обновленное содержимое файла конфигурации будет прочитано и учтено.

Перезагрузка конфигурации осуществляется гораздо быстрее, но не все службы поддерживают ее.

Подкоманды start, stop, restart и reload оказывают влияние лишь на текущую рабочую сессию.

Активация и деактивация системных служб

Многие системные администраторы, мало знакомые с Linux, не понимают разницы между подкомандами start/stop и enable/disable. Я уже рассказывал о командах start, stop и restart в предыдущем разделе.

Подкоманды start и stop изменяют текущее состояние службы. Однако, после перезагрузки системы ее состояние будет приведено к тому, которое было установлено по умолчанию. Другими словами, если я остановлю службу cron и перезагружу компьютер, в процессе его загрузки она будет снова запущена.

В прошлом вы наверняка использовали команду chkconfig для установки уровней исполнения для запуска и остановки тех или иных служб. Например:

# chkconfig --level 35 cron on

Эта команда активирует запуск службы cron на уровнях исполнения 3 и 5.

В случае с systemctl активация запуска служб осуществляется с помощью подкоманд enable и disable. Синтаксис соответствующих команд аналогичен синтаксису команд с подкомандами start, stop и restart.

Например, для активации запуска службы cron в процессе загрузки системы может использоваться следующая команда:

# systemctl enable cron

Аналогично, для деактивации запуска этой службы в процессе загрузки системы может использоваться следующая команда:

# systemctl disable cron

Активация и деактивация системных служб, по аналогии с их запуском и остановкой, обычно не вызывает каких-либо вопросов. Однако, вопросы появляются в случае необходимости использования обоих классов подкоманд.

Совместное использование подкоманд для активации и запуска системных служб

Некоторым системным администраторам и пользователям может показаться странным то, что подкоманда активации системной службы не запускает ее. Например, если вы установили системную программу и хотите запустить ее для тестирования работоспособности, после чего хотите активировать ее запуск в процессе загрузки системы, вам придется выполнить две команды:

# systemctl start cron
# systemctl enable cron
Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable cron
Created symlink /etc/systemd/system/multi-user.target.wants/cron.service → /lib/systemd/system/cron.service.

Деактивация системной службы осуществляется по аналогичной схеме. Вам придется использовать подкоманду disable для деактивации запуска службы в процессе загрузки системы. Однако, в том случае, если служба уже запущена, вам придется использовать подкоманду stop для завершения ее работы.

Например, деактивация и остановка службы cron могут быть осуществлены с помощью следующих команд:

# systemctl stop cron
# systemctl disable cron
Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable cron
Removed /etc/systemd/system/multi-user.target.wants/cron.service.

Не забывайте о том, что вы всегда можете воспользоваться подкомандой status, если не уверены в корректности выполненных действий:

# systemctl status cron

Для того, чтобы убедиться в том, что запуск службы при загрузке системы активрован, вы можете воспользоваться еще одной подкомандой systemctl под названием is-enabled. Например, для проверки статуса активации службы cron следует использовать следующую команду:

# systemctl is-enabled cron
enabled

Множество подкоманд и полезный механизм для получения их списка

Я рассказал о некоторых подкомандах systemctl, таких, как start, stop, restart, enable, disable, status и некоторых других. Их уже достаточно для того, чтобы запутаться! Если вы используете Fedora Workstation, то вам поможет старый друг — клавиша Tab, используемая для автозавершения команд. Попробуйте сделать следующее: введите команду systemctl и символ пробела после нее. После этого дважды нажмите клавишу Tab, в результате чего должен быть выведен полный список подкоманд команды systemctl. Не уверен, что большинство системных администраторов и пользователей знают о данном механизме.

Заключение

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

Вам следует запомнить следующие правила:

  • Для управления текущим состоянием служб следует использовать подкоманды start/stop/restart
  • После модификации файлов конфигурации системных служб следует использовать подкоманды start/stop/restart/reload
  • Для активации и деактивации запуска системных служб в процессе загрузки системы следует использовать подкоманды enable/disable
  • В процессе диагностики системы следует использовать подкоманду status на раннем этапе

Наконец, вам не придется запоминать все подкоманды systemctl. Вы можете либо просто ввести systemctl, символ пробела и дважды нажать Tab, либо воспользоваться командой systemctl --help, если первый вариант не срабатывает.

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