Init — традиционное имя для программы, которая выполняется как process ID 1, главный предок всех процессов Unix, исторически отвечающий за управление системой. Process ID 1 настолько критичен для системы, что его или невозможно убить, или система перезапускается при выходе из него (или и то, и другое, тогда этот перезапуск — хак). Сегодня в Linux PID 1 необязательно оказывается двоичным файлом и процессом с именем init
в буквальном смысле, в отличие от *BSD, где init
остаётся двоичным файлом.
Исторически сложилось так, что по множеству причин системный администратор отправляет сигналы в init
, что задокументировано для современных систем Unix, например, на странице руководства к init(8)
FreeBSD. Одна из причин заключается в том, чтобы считывать заново список последовательных портов. Традиционно и даже сегодня это выполнялось отправкой init
сигнала SIGHUP.
Программа kill
долгое время поддерживала отправку сигналов по имени, но сисадмины ленивы и мы обычно запоминали что SIGHUP — это сигнал 1 (а сигнал 9 — это SIGKILL). Поэтому довольно часто мы вводили kill -1 1
для отправки сигнала 1 (SIGHUP) к process ID 1 (init). Однако эта версия немного опасна, потому что она лишь на один символ отличается от версии с совершенно другими эффектами:
kill -1 -1
Достаточно лишь случайно повторить -1
(вместо 1
) и получить другой, очень плохой результат.
(На мой взгляд, ввод kill -HUP 1
сильно снижает вероятность этого, потому что здесь нельзя просто повторить -1
, хоть и можно машинально ввести -
перед обоими аргументами.)
Целевой process ID -1 очень специфичен, особенно если вы в это время под рутом. И в kill(1)
, и в kill(2)
использование -1
под рутом означает «(почти) все процессы в системе». То есть добавив один лишний символ, мы отправляем сигнал SIGHUP не к init
, а почти ко всем запущенным пользовательским и вспомогательным процессам. Часть из них отреагирует на это безвредно, например, повторно считает файлы конфигурации и заново запустится, но многие процессы завершат работу внезапно, в том числе и некоторые вспомогательные процессы.
В те времена, когда мы отправляли SIGHUP к init
, случайное выполнение этой команды часто было хорошим способом перезапуска системы. Даже ещё десяток лет назад случайный ввод kill -1 -1 под рутом (по иной причине) был хорошим способом устроить перезапуск.
(Сейчас я уже не помню, совершал ли в те времена подобную ошибку, но я вводил kill -1 -1 в ошибочном контексте.)