Какой лучший способ убрать после вилочной бомбы?


21
$ ls
bash: no more processes

Ооо Похоже, кто-то сделал вилочную бомбу. Там, где я раньше работал, это в значительной степени означало, что общий сервер должен был выключаться и выключаться, поскольку даже системные администраторы с root-правами часто не могли решить проблему. Часто они даже не могли получить подсказку.

Я слышал несколько трюков (в частности, для отправки сигналов STOP, а не KILL, поскольку последние позволили бы оставшимся потокам немедленно заменить убитые), но я никогда не видел подробного руководства под названием « Итак, вы сами» вилочная бомба?

Давайте сделаем один.

Ответы:


10

Не допускайте исчерпания технологического лимита вилкой-бомбы с разумным для каждого пользователя пределом процесса, используя ulimit .

Таким образом, один пользователь исчерпает свою квоту процесса задолго до того, как будет достигнут системный лимит.


6

Первое, что нужно попробовать, - это заставить пользователей, которые вошли в систему, выйти из системы. Возможно, что их оболочка может быть родительским процессом процесса, выполняющим всю разветвленность, и это может решить проблему.

Если это не сработает, вы можете попробовать запустить kill -STOP -2от имени пользователя root, чтобы заморозить все процессы, запущенные от имени любого пользователя, кроме root. Если это сработает, вы можете использовать их kill -CONT <pid>для размораживания некоторых известных процессов, которые не связаны с вилочной бомбой, и уничтожения их, чтобы устранить проблему с таблицей процессов полностью и дать вам некоторое пространство для поиска и устранения первоначального источника проблемы. Sendmail был бы хорошим примером системного процесса для уничтожения, поскольку его было бы легко идентифицировать, используя файл .pid для идентификации pid. Например, kill -CONT $(< /var/run/sendmail.pid); kill $(< /var/run/sendmail.pid).


В какой ОС вы видите опцию «-2» для kill? Я не вижу этого на странице руководства по Linux.
Ралди

1
Это должно работать в большинстве ОС, так как вы указываете отрицательное значение для pid. Если <pid> меньше -1, то kill отправляется каждому процессу в группе процессов - <pid>. Отправив sig STOP на pid-2, он должен остановить все процессы, которые не являются специальными системными процессами или процессами, принадлежащими корню.

См. Man-страницу kill (2) для уничтожения «отрицательного pid», но я все еще не верю, что это работает. Почему все неинициализированные процессы должны быть в группе 2? Я понимаю , что вы хотите , чтобы избежать первонача, поскольку результатов остановить его часто весьма смертельный исход, но ...
ephemient

@ephemient, 2 слишком мало, чтобы быть идентификатором группы процессов, так что, возможно, это другое специальное значение.
Джошудсон


3

Не уверен, как вы могли бы даже отправить сигнал STOP, так как порождение killпотребовало бы доступного дескриптора процесса. Кроме того, по моему опыту, системы перегружаются и становятся непригодными для использования задолго до завершения процессов.

Рассматривали ли вы просто соблюдение лимитов процессов для каждого пользователя с помощью ulimit? Это помешает вашим пользователям запускать вилочные бомбы (случайно или нет).


3
kill - это встроенная оболочка, по крайней мере, в bash.
Ралди

1
Я думаю, что это ключевой компонент - определить встроенные функции для вашей оболочки по выбору.

2
Если он не встроенный, вы можете запустить exec kill PID, который не разветвляется. Но это рискованно, поскольку, если это не сработает, вы не сможете получить другую оболочку. Думайте об этом как о пчелином подходе к системному администрированию!
Стивен Дарлингтон

2

Некоторые системы BSD имеют возможность зарезервировать последние 5 или около того процессов для root. Возможно, ваша система обладает такой способностью.


3
Как вы на самом деле настроить систему для этого?
Ник Рейман
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.