Почему команда «: () {: |: &} ;:« заставляла мою систему отставать так сильно, что мне пришлось перезагружаться?

252
  

ОПАСНОСТЬ !

     

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

Я был в моем виртуальном боксе, работающем 12.04, пытаясь скомпилировать приложение, и, ожидая, я случайно оказался на форуме, где в комментарии говорилось:

  

Попробуйте :(){ :|: & };:
  Прикольно и не нужно root.

Не думая, я запустил его в своем гном-терминале. Это сделало мой 12,04 (в Virtualbox) лаг так плохо, мне пришлось закрыть его.

Мой вопрос в том, что делает эта команда?

:(){ :|: & };:
    
задан blade19899 04.07.2012 в 11:29
источник

4 ответа

321

Это называется вилкой бомбы .

:() означает, что вы определяете функцию с именем :

{:|: &} означает запустить функцию : и снова отправить свой результат функции : и запустить ее в фоновом режиме.

; - разделитель команд, например && .

: запускает функцию в первый раз.

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

Запуск в Virtualbox был вполне разумным, в противном случае вам пришлось бы перезагрузить компьютер.

    
ответ дан SuperMatt 04.07.2012 в 11:34
источник
144

Это так называемая вилка-бомба , реализованная в оболочке.

из википедии:

:(){ :|:& };:
\_/| |||| ||\- ... the function ':', initiating a chain-reaction: each ':' will start    two more.
 | | |||| |\- Definition ends now, to be able to run ...
 | | |||| \- End of function-block
 | | |||\- disown the functions (make them a background process), so that the children    of a parent
 | | |||   will not be killed when the parent gets auto-killed
 | | ||\- ... another copy of the ':'-function, which has to be loaded into memory.
 | | ||   So, ':|:' simply loads two copies of the function, whenever ':' is called
 | | |\- ... and pipe its output to ...
 | | \- Load a copy of the function ':' into memory ...
 | \- Begin of function-definition
 \- Define the function ':' without any parameters '()' as follows:
    
ответ дан Michał Šrajer 04.07.2012 в 11:35
67

Эта команда является известной версией вилки бомбы

Это приводит к тому, что ваш компьютер исчерпывает память, бесконечно обрабатывая процесс. Существуют некоторые меры предосторожности, которые вы можете использовать против него:

  

Системы типа Unix обычно имеют предел процесса, управляемый командой ulimit shell или ее преемником setrlimit. Ядра Linux устанавливают и применяют RLIMIT_NPROC rlimit («ограничение ресурсов») процесса. Если процесс пытается выполнить вилку, а пользователь, которому принадлежит этот процесс, уже владеет процессами RLIMIT_NPROC , то вилка выходит из строя. Кроме того, в Linux или * BSD можно редактировать файл конфигурации pam_limits /etc/security/limits.conf с тем же эффектом. Однако не все дистрибутивы Linux имеют установленный по умолчанию модуль pam_limits .

    
ответ дан Nemo 04.07.2012 в 11:37
17

В соответствии с этим :(){ :|: & };: называется

  

Forkbomb - своего рода создатель поэтического вируса

     

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

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

Другая ссылка объясняет снимки экрана здесь .

    
ответ дан atenz 04.07.2012 в 11:35