Как работает «в то время как (сон 100 &!) do; сделаны» работа в Zsh, и как он может быть повторен в Баше?


14

Согласно Wikipedia, то forkbomb :(){ :|:& };: может быть остановлен с ЗШ командой while (sleep 100 &!) do; done, который предположительно икра сна 100 обрабатывает до . исчезли все процессы forkbomb Это похоже на волшебство,?., как это работает, я особенно любопытно, что именно «! &» означает

Что бы эквивалент команды выглядеть в Баш

11

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

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

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

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

Как уже упоминалось важную часть ЗШ команды является вводного фону &, поэтому команда Баш будет в основном быть такой же, как указано в других ответах:

while (sleep 100 &) do; done 

Я надеваю Не думаю, что часть nohup/! важна, если вы не хотите выходить из системы во время сна, но я был бы счастлив, если бы был прав, если я ошибаюсь.


2

? Очень интересный вопрос!

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

Согласно zsh manual,

Если работа начинается с &|' or &!», то, что работа немедленно отрекся. После запуска он не имеет места в таблице рабочих мест и не является с учетом функций управления заданиями , описанных здесь.

Я не уверен, как достичь этого с помощью bash. Тем не менее, что-то вроде следующего может сделать:

nohup sleep 100 & 

8

Сначала вилка бомба может быть написана:

foo() 
{ 
    foo|foo& 
} 
foo 

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

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

Zsh &! походит на &, но отзывает новый процесс (не убивает его при выходе из системы) - это, вероятно, не важно в этом примере. (manual) Его можно заменить на nohup.

Поэтому баш:

while (nohup sleep 100 &) do; done 

должен работать.


6

Я парень, который написал эту часть статьи в Википедии (и кто «открыл» это лекарство после случайного запуска вилочной бомбы в моей системе!).

Причина "&!" вместо «&» на самом деле не позволяет zsh выполнять контроль над новым процессом, т. е. старается заботиться о том, когда и когда он закончится. Я не помню точно, почему контроль над заданиями был проблемой, когда я это пробовал, но это было так. Вы действительно можете попробовать, чтобы увидеть, как работает «лечение», и что происходит, если вы не предотвращаете контроль над работой. Возможно, проблема с контролем работы связана с некоторой ошибкой в ​​zsh, которая даже не существует в bash, и, возможно, она больше не актуальна в zsh.

Так что попробуйте просто «&» с bash, и если управление заданиями мешает, попробуйте отключить его («set + m») и, надеюсь, это сработает.

Вы правы, что статья в Википедии, вероятно, не зависит от zsh.