Назад | Перейти на главную страницу

Как лучше всего убраться после взрыва бомбы?

$ ls
bash: no more processes

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

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

Сделаем один.

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

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

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

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

Не уверен, как можно было даже отправить сигнал СТОП, так как нерест kill потребуется доступный дескриптор процесса. Кроме того, по моему опыту, системы становятся перегруженными и непригодными для использования задолго до того, как исчерпываются процессы.

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

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