Как узнать, использую ли я systemd в Linux?

Вопрос или проблема

Как я могу узнать, если моя Linux запускается с systemd или каким-либо другим пакетом?

Я знаю, что это старый вопрос, но так как я только что спрашивал то же самое – вот мой ответ.

Лучшее решение, которое я придумал

ps --no-headers -o comm 1

Это вернет либо systemd, либо init и кажется надежным на различных дистрибутивах и версиях Linux.

file /sbin/init сработает с помощью шаблонного сопоставления. Вывод ps 1 может не помочь, так как на некоторых дистрибутивах Linux он выведет ‘init’ (символьная ссылка), даже если используется systemd.

Debian 8

$ ps 1
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:02 /sbin/init
$ file /sbin/init
/sbin/init: symbolic link to /lib/systemd/systemd

RHEL 7

$ ps 1
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     7:46 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
$ file /sbin/init
/sbin/init: symbolic link to `../lib/systemd/systemd'

SLES 12

$ ps 1
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:24 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
$ file /sbin/init
/sbin/init: symbolic link to `../usr/lib/systemd/systemd'

openSUSE 13.1

$ ps 1
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:33 /sbin/init showopts
$ /sbin/init: symbolic link to `../usr/lib/systemd/systemd'

Проверьте, какой процесс работает как PID 1. Вы можете сделать это, выполнив ps 1 и прокрутив до верха. Если у вас что-то из systemd работает как PID 1, значит, у вас работает systemd.

Кроме того, выполните systemctl, чтобы перечислить работающие единицы systemd.

Также стоит проверить, что такое /sbin/init; file /sbin/init подскажет, является ли это настоящим исполняемым файлом или это символическая ссылка на исполняемый файл какого-то другого пакета. Например, на компьютере с systemd:

root@boxy / # file /sbin/init
/sbin/init: symbolic link to ../lib/systemd/systemd

Для получения дополнительной информации посетите: https://en.wikipedia.org/wiki/Linux_startup_process

Другой способ узнать, что именно установлено на вашей системе, это ввести man init и посмотреть, на странице какого руководства вы окажетесь.

Правильное решение – проверить наличие директории /run/systemd/system.

[[ -d /run/systemd/system ]] && echo "using systemd" 

Этот метод используется собственной библиотечной функцией systemd sd_booted(): https://www.freedesktop.org/software/systemd/man/sd_booted.html

Выполните systemd-notify --booted (или systemctl is-system-running --quiet) и проверьте, вернет ли она 0 или нет.

Из руководства systemd-notify(1):

   --booted
       Возвращает 0, если система была загружена с systemd,
       ненулевое значение в противном случае. Если этот параметр передан, сообщение не отправляется.
       Этот параметр, следовательно, не связан с другими параметрами. Для деталей касательно
       семантики этого параметра см. sd_booted(3). Альтернативный способ
       проверки этого состояния - вызвать systemctl(1)
       с командой is-system-running. Она вернет
       "offline", если система была загружена без
       systemd.

Обновление: 2024-09-25

systemctl is-system-running сообщает degraded и выходит с 1, если systemd работает, но одна или несколько единиц вышли из строя.

Я использую эту команду :

ps -p 1 -o comm=

Опция -p используется, чтобы указать PID, в данном случае это PID первого процесса.

Опция -o используется для вывода только указанного поля comm, которое в данном случае является только именем исполняемого файла.

Знак = в конце имени заголовка предотвращает отображение строки заголовка.

В руководстве man ps говорится :

$ man ps | sed -n '/^\s*comm\s*COMMAND/,/^$/ p'
       comm        COMMAND   имя команды (только имя исполняемого файла). Изменения в имени команды не будут
                             отображены. Процесс, помеченный как <defunct>, частично мертв, ожидает полного уничтожения его
                             родителем. Вывод в этом столбце может содержать пробелы. (алиасы ucmd, ucomm). См. также
                             ключевое слово формата args, опцию -f и опцию c.
                             Когда указан последним, этот столбец будет расширяться до края дисплея. Если ps не может
                             определить ширину дисплея, как в случае, когда вывод перенаправлен (в трубу) в файл или другую команду,
                             ширина вывода не определена (может быть 80, неограниченная, определена переменной TERM и
                             так далее). Переменная среды COLUMNS или опция --cols могут быть использованы для точного определения
                             ширины в этом случае. Опции w или -w также могут быть использованы для регулирования ширины.

Лучший ответ, который я нашел до сих пор, это спросить у диспетчера пакетов вашего дистрибутива, какой пакет установил файл /sbin/init. Например, в Debian это будет

dpkg -S /sbin/init

Если /sbin/init не существует в вашей системе, вы можете вместо этого проверить, какая программа имеет pid 1 с помощью ps 1.

@Trevor-Boyd-Smith ссылался на это обсуждение на Unix Stackexchange, на основе которого я хотел бы предложить:

[[ `systemctl` =~ -\.mount ]] || { echo 'Systemd не найден'; exit 1; }

Это bash выражение либо просто выполнится, либо выведет сообщение и завершит выполнение скрипта.

Ответ или решение

Узнать, используется ли в вашей системе Linux система инициализации systemd, достаточно просто, если воспользоваться несколькими из доступных методов. Вот как можно это сделать:

Быстрые способы проверки

  1. Проверка процесса с PID 1:
    Самый простой способ — это посмотреть, какой процесс запущен системой как первый. Для этого выполните команду:

    ps --no-headers -o comm 1

    Эта команда выведет имя процесса. Если выводится systemd, значит используется именно эта система инициализации.

  2. Использование systemctl:
    Если при выполнении команды systemctl не возникает ошибок или возвращаются активные юниты, то скорее всего используется systemd.

  3. Проверка ссылки /sbin/init:
    Вы можете определить, на какую программу ссылается файл /sbin/init. Это можно сделать с помощью команды:

    file /sbin/init

    Если файл является символической ссылкой на /lib/systemd/systemd или похожий файл, то это указывает на использование systemd.

  4. Проверка директории /run/systemd/system:
    Наличие в системе директории /run/systemd/system явно указывает на использование systemd. Проверить это можно командой:

    [[ -d /run/systemd/system ]] && echo "Используется systemd"
  5. Использование systemd-notify:
    Вы можете воспользоваться командой systemd-notify --booted, которая вернёт 0, если система была загружена с использованием systemd.

Расширенные методы

  • Проверка через менеджер пакетов:
    На системах на базе Debian можно использовать dpkg для определения, каким пакетом установлен /sbin/init:

    dpkg -S /sbin/init

    Если установка была выполнена пакетом systemd, то ваша система использует именно его.

  • Использование мануала:
    Запустив man init, вы можете определить, какой страницы мануала это открывает, что также может дать подсказку о текущей системе инициализации.

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

Оцените материал
Добавить комментарий

Капча загружается...