Pull to refresh

Старая ошибка Unix, которую вы можете совершить при сигнале init (PID 1)

Level of difficultyMedium
Reading time2 min
Views4.1K
Original author: Chris Siebenmann

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 в ошибочном контексте.)

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 17: ↑16 and ↓1+24
Comments2

Articles