Как работает fork-бомба: в C (или подобный C) код, называют функцию fork()
назван. Это заставляет Linux или Unix или Unix-likes создавать совершенно новый процесс. Этот процесс имеет адресное пространство, идентификатор процесса, маску сигнала, открытые дескрипторы файлов, весь способ вещей, которые занимают место в несколько ограниченной памяти ядра ОС. Недавно созданный процесс также заставляет место в структуре данных ядра для процессов работать. К процессу, который звонил fork()
, похоже, что ничего не произошло. Процесс fork-бомбы попытается звонить fork()
с такой скоростью, как это может, так много раз, как это может.
Прием - то, что недавно созданный процесс также возвращается из fork()
в том же коде. После ветвления у Вас есть два процесса, выполняющие тот же код. Каждый новый процесс fork-бомбы пытается звонить fork()
с такой скоростью, как это может, так много раз, как это может. Код, который Вы дали как пример, является версией сценария Bash fork-бомбы.
Скоро, связанные с процессом ресурсы ядра всей ОС привыкают. Таблица процессов полна. Список ожидания-к-управляемому процессов является полным. Реальная память полна, таким образом, подкачка страниц запускается. Если это продолжается достаточно долго, раздел подкачки заполняется.
На что это похоже пользователю: все работает супер медленно. Вы добираетесь, сообщения об ошибках как "не могли создать процесс" при попытке простых вещей как ls
. Попытка a ps
вызывает бесконечную паузу (если она работает вообще), и отдает очень длинный список процессов. Иногда эта ситуация требует перезагрузки через шнур питания.
Fork-бомбы раньше назывались "кроликами" назад в былые времена. Поскольку они воспроизвели так быстро.
Только для забавы, я записал программу fork-бомбы в C:
#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
while (1)
fork();
return 0;
}
Я скомпилировал и запустил ту программу под Дугой Linux в одном xterm. Я другой xterm я пытался получить список процессов:
1004 % ps -fu bediger
zsh: fork failed: resource temporarily unavailable
Оболочка Z в 2-м xterm не могла звонить fork()
успешно, поскольку процессы fork-бомбы, связанные с 1-м xterm, израсходовали все ресурсы ядра, связанные с созданным процессом и выполнение.
Можно ослабиться requiretty
начинание /etc/sudoer
.
выборка из sudoers страницы справочника
requiretty If set, sudo will only run when the user is logged in to a real
tty. When this flag is set, sudo can only be run from a login
session and not via other means such as cron(8) or cgi-bin
scripts. This flag is off by default.
По умолчанию эта строка говорит, что у всех должен быть tty доступ при использовании sudo
:
Defaults requiretty
Можно ослабить его на пользователя и/или группу как это:
$ sudo visudo
# group
Defaults:%group !requiretty
# user
Defaults:user !requiretty
примечание: !
средства not
.
Дополнительную информацию см. в sudo и sudoers страницах справочника.