Який найкращий спосіб очистити після вилкової бомби?


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" для вбивства? Я не бачу цього на сторінці man в Linux.
raldi

1
Це має працювати в більшості ОС, оскільки ви вказуєте негативне значення для pid. Якщо <pid> менше -1, то введення надсилається до кожного процесу в групі процесів - <pid>. Надіславши знак STOP на pid -2, він повинен зупиняти всі процеси, які не є спеціальними системними процесами або процесами, що належать root.

Дивіться сторінку вбивства (2) для вбивства "негативного подруги", але я все ще не вірю, що це працює. Чому всі неінітаційні процеси перебувають у групі 2? Я розумію, що ви хочете уникати init, оскільки результати його зупинки часто є дуже смертельними, але ...
ephemient

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

@Joshua Поруч немає жодних спеціальних значень 0і -1, згідно opengroup.org/onlinepubs/009695399/functions/kill.html opengroup.org/onlinepubs/000095399/utilities/kill.html
ефемінник

3

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

Чи вирішили ви просто застосовувати ліміти процесів для кожного користувача ulimit? Це заважає вашим користувачам (випадково чи ні) запускати вилочні бомби.


3
kill - це вбудована оболонка, принаймні в баш.
raldi

1
Я думаю, що це ключовий компонент - визначте вбудовані для обраної вами оболонки.

2
Якщо це не вбудований, ви можете запустити "exec kill PID", який не розщедриться. Але це ризиковано, оскільки, якщо це не працює, ви не зможете отримати іншу оболонку. Подумайте про це як про підхід бджолиного жаху до адміністрування системи!
Стівен Дарлінгтон

2

Деякі системи BSD мають можливість резервувати останні 5 процесів для кореня. Можливо, ваша система має таку здатність.


3
Як ви насправді налаштовуєте систему для цього?
Нік Рейман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.