Отец всех процессов
Если в параметрах не указано иное, ядро считает, что init называется /sbin/init
. В стартовом виртуальном диске это обычно некоторый простейший сценарий, а в полноценной системе у init другая задача: он запускает все процессы. Если процессы запускает не он сам, то это делают его потомки, так что все процессы Linux, кроме ядерных, происходят от init.
Первым делом init разбирает собственный конфигурационный файл - /etc/inittab
. Файл этот имеет довольно простую структуру: каждая строка (если она не комментарий) имеет вид id:уровни:действие:процесс
, где id
- это некоторая двух- или однобуквенная метка, уровни - это слово, каждая буква которого соответствует уровню выполнения (об уровнях выполнения будет рассказано далее), действие - это способ запуска процесса. Например, запись 4:2345:respawn:/sbin/mingetty tty4
означает, что меткой 4
помечен запуск /sbin/mingetty tty4
на уровнях выполнения 2
, 3
, 4
и 5
по алгоритму respawn
(запустить в фоне, а когда процесс завершится, запустить заново). Помимо respawn
, существуют методы once
(запустить в фоне однократно), wait
(запустить интерактивно, при этом никаких других действий не выполняется, пока процесс не завершится) и множество других, включая даже ctrlaltdel
- процесс, запускаемый, когда пользователь нажимает на консоли Ctrl+Alt+Del
.
Наконец-то Иван до конца понял, отчего getty
ведет себя так непохоже на остальные процессы: не просто запускает из-под себя login
, а дожидается окончания его работы, отсутствуя при этом в таблице процессов. На самом деле дожидается не getty
, а init
, используя метод respawn
: порождается (в фоне) процесс getty
с определенным PID, а init
бездействует до тех пор, пока существует процесс с этим PID: getty
, login
, стартовый командный интерпретатор или программа, запущенная из него с помощью exec()
; когда же процесс, наконец, умирает, порождается новый getty
.