Как "во время (sleep 100 &!) Делать" работать "в zsh и как его можно реплицировать в bash?

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

Как выглядит эквивалентная команда в bash?

Ответы

Ответ 1

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

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

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

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

Как уже упоминалось, важной частью команды zsh является run-in-background &, поэтому команда bash в основном будет такой же, как и в других ответах:

while (sleep 100 &) do; done

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

Ответ 2

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

foo()
{
    foo|foo&
}
foo

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

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

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

Поэтому bash:

while (nohup sleep 100 &) do; done

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

Ответ 3

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

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

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

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

Ответ 4

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

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

В соответствии с руководство zsh,

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

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

nohup sleep 100 &