Почему вилочная бомба не может быть убита в ZSH так же, как она убита в Bash?

Я получил решение с imagemagick для конвертации и parallel для ускорения процесса конвертации:

ls *.JPEG |parallel convert -density 200 -resize 496X646 -quality 100 {}  ../{.}.PDF
0
24.12.2018, 09:55
1 ответ

В bash, когда fork()завершается ошибкой с EAGAIN, например, при достижении предела (с использованием setrlimit или с использованием этих ограничений pid cgroup ), bashзасыпает и пытается снова через 1 секунду, а затем через 2 секунды, если он снова не работает, а затем через 4, а затем он засыпает на 8 секунд и сдается, даже не попробовав еще один форк (! )).

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

Закрытие терминала не уничтожает эти процессы. Может быть, то, что вы видите, это форк-бомба, угасающая через чуть более 15 секунд (1+2+4+8 ), когда все процессы, которые успели запуститься и перешли в спящий режим, умирают в одно и то же время. через 8 секунд после их 4-й попытки разветвления.

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

Если вы хотите убить форк-бомбу, проще всего убить группу процессов в целом, использование killallне работает, так как killallнужно собрать список процессов, а затем отправить уничтожение отдельно для каждого обработать. Это нормально с bash, где все процессы спят, но не с другими оболочками, которые постоянно порождают процессы, поэтому процессы могут запускаться между каждым уничтожением.

Вы можете получить pgid с помощью ps -jи убить группу процессов с помощью kill -- "-$pgid".

1
28.01.2020, 02:41

Теги

Похожие вопросы