Вопрос или проблема
Как я могу узнать, если моя 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
, достаточно просто, если воспользоваться несколькими из доступных методов. Вот как можно это сделать:
Быстрые способы проверки
-
Проверка процесса с PID 1:
Самый простой способ — это посмотреть, какой процесс запущен системой как первый. Для этого выполните команду:ps --no-headers -o comm 1
Эта команда выведет имя процесса. Если выводится
systemd
, значит используется именно эта система инициализации. -
Использование
systemctl
:
Если при выполнении командыsystemctl
не возникает ошибок или возвращаются активные юниты, то скорее всего используетсяsystemd
. -
Проверка ссылки
/sbin/init
:
Вы можете определить, на какую программу ссылается файл/sbin/init
. Это можно сделать с помощью команды:file /sbin/init
Если файл является символической ссылкой на
/lib/systemd/systemd
или похожий файл, то это указывает на использованиеsystemd
. -
Проверка директории
/run/systemd/system
:
Наличие в системе директории/run/systemd/system
явно указывает на использованиеsystemd
. Проверить это можно командой:[[ -d /run/systemd/system ]] && echo "Используется systemd"
-
Использование
systemd-notify
:
Вы можете воспользоваться командойsystemd-notify --booted
, которая вернёт 0, если система была загружена с использованиемsystemd
.
Расширенные методы
-
Проверка через менеджер пакетов:
На системах на базе Debian можно использоватьdpkg
для определения, каким пакетом установлен/sbin/init
:dpkg -S /sbin/init
Если установка была выполнена пакетом
systemd
, то ваша система использует именно его. -
Использование мануала:
Запустивman init
, вы можете определить, какой страницы мануала это открывает, что также может дать подсказку о текущей системе инициализации.
Каждый из этих методов обладает своими преимуществами и может быть использован в различных сценариях, чтобы с уверенностью определить систему инициализации вашей Linux системы. Это будет полезно для системных администраторов и разработчиков, работающих с различными конфигурациями Linux.