Сценарий инициализации в Linux
Основные понятия
Узнать какая система инициализировала процесс № 1 можно с помощью команды:
ps -p 1
Или:
ps -s 1
Или так:
file /sbin/init
Система инициализации SysVinit
Система инициализации Upstar как замена System V init
service это команда управления Upstart которая частично используется для совместимости в новых версиях и работает с файлами /etc/init.d
Система инициализации Service Management Facility
Система инициализации Systemd
Сценарии инициализации предназначены для запуска системных демонов. На каждый демон один сценарий. Каждый следующий сценарий ожидает завершение выполнения предыдущего сценария.
Загрузчик ядра Linux передает управление ядру Linux, который в свою очередь запускает демон системы инициализации (/sbin/init), этот демон носит PID=1 и не завершает свою работу до выключения машины.
Далее демон читает конфигурационный файл /etc/inittab. В нем демон будет искать значение переменной initdefault которая указывает на уровень исполнения.
Например уровень 1 соответствует однопользовательскому режиму.
В файле конфигурации inittab строка si::sysinit:/etc/rc.d/rc.sysinit говорит что независимо от уровня выполнения будет выполняться /etc/rc.d/rc.sysinit. Это сценарий который осуществляет инициализацию аппаратного обеспечения , подключает раздел подкачки, устанавливает значения переменных окружения, заполняет файл /etc/mtab в процессе монтирования fs и мн. др.
Будут выполняться все сценарии типа rc0-6.d rcS.d
В директории /etc/init.d находятся сценарии для запуска и остановки демонов
update-rc.d
update-rc.d служит для запуска остановки скриптов при старте или выключении системы.
Узнать текущий уровень исполнения можно с помощью команды runlevel или who -r
Изменить уровень исполнения можно с помощью команды telinit (/sbin/init)
Система инициализации Systemd
Данная система состоит из юнитов.
Юниты могут взаимодействовать между собой
Чтобы убедиться, что на машине используется SystemD выполнить следующую команду:
pstree
Команда покажет дерево процессов, которое начинается с systemd
systemctl - команда управления менеджером системы Systemd
systemctl работает с файлами в /lib/systemd.
Если в /lib/systemd есть файл для вашей службы, он будет использовать его в первую очередь, а если нет, он вернется к файлу в /etc/init.d
Следующая команда выводит список назначение системы инициализации.
systemctl -t target
Показать все юниты в системе:
systemctl list-unit-files
Показать список всех запущенных юнитов:
systemctl
Показать юниты, которые плохо кончили
systemctl --failed
Проверить наличие службы в автозапуске:
systemctl is-enabled nginx.service
init скрипт
Пример init (далеко не идеал, лишь наглядно демонстрирует принцип работы)
#!/bin/bash
#
# Provides: demon1
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: demon1
# Description: Start the demon1
### END INIT INFO
export DEMON_HOME=home/toly/bash_scripts/DEMON/demon-1
service_name="demon1"
start() {
echo "Starting demon1..."
/$DEMON_HOME/demon1
}
stop() {
echo "Stopping demon1..."
}
status() {
if (( $(ps -ef | grep -v grep | grep $service_name | wc -l) > 0 )); then
echo "$service_name is running!!!"
else
echo "$service_name is down!!!"
fi
}
case $1 in
start|stop|status) $1;;
restart) stop; start;;
*) echo "Usage : $0 "; exit 1;;
esac
exit 0