Как остановить Fork-бомбу из ошибки памяти - RHEL 6

Простой путь состоит в том, чтобы работать:

!!echo %
  • !! заменяет текущую строку результатом команды после него.

  • % заменяется под названием отредактированный файл в команде, таким образом, это эффективно вставит то имя в отредактированном файле.

Имя файла является тем, которое Вы передали vi (m) команду и могли бы содержать относительный или полный путь. Если Вы хотите разделить его и только сохранить имя файла, работать

!!basename %
7
12.10.2013, 20:21
3 ответа

Там должен так или иначе остановить это, не перезагружая машину?

Это не совсем невозможно, и можно сделать это через удачу - т.е. Вам удается уничтожить все процессы, прежде чем другой будет порожден 1, Но необходимо стать очень очень удачливыми, таким образом, это не надежное или стоящее усилие [возможно, slm, более удачно, чем я здесь, lol - TBH, я не попробовал это трудно]. Если Вы играете вокруг с приоритетами, Ваши возможности могли бы улучшиться (см. man nice), хотя я подозреваю, что это также смешает с эффективностью fork-бомбы.

Лучшая идея могла бы состоять в том, чтобы использовать ту, которая испытывает таймаут. Для примера в C посмотрите номер сноски 5 к моему ответу здесь 2, можно сделать то же самое со сценарием оболочки, хотя не было бы так же коротко как :(){ :|:& };::

#!/bin/bash

export fbomb_duration=$1
export fbomb_start=$(date +%s)

go () {
    now=$(date +%s)
    if [[ $(($now-$fbomb_start)) -gt $fbomb_duration ]]
        then exit 0;
    fi
    go &
}

while ((1)); do
    go
done           

Выполните это с одним аргументом, много секунд. Все ветвления умрут после того времени.

1 На самом деле, это может произойти все самостоятельно, в конечном счете, если ядро уничтожитель OOM становится удачным. Но не задерживайте дыхание.

2 метод раньше там зажимал в тиски ту конкретную бомбу (путем установки vm.overcommit_memory=2) не будет почти наверняка работать в целом, но Вы могли попробовать. Я не, так как я хотел бы оставить свою систему, работающую на данный момент ;)

3
27.01.2020, 20:17
  • 1
    я думаю, что Вы могли упростить это при помощи снов вместо этого. Возможно? –  slm♦ 12.10.2013, 21:23
  • 2
    @slm лучшее можно сделать с нормальным ядром с точки зрения гранулярности сна, 10 мс, и это слишком длинно - это было бы больше шипящего круга ветвления, чем fork-бомба. –  goldilocks 14.10.2013, 17:48

При разработке ответа для этого вопроса, названного: Где ветвление () на fork-бомбе :() {:|: и};:?, я соединил то, что я назвал, предохранитель задержал fork-бомбу, которую было легче уничтожить.

Дополнительно при разработке того ответа я регулярно смог остановить fork-бомбу путем уничтожения всех процессов. Это было легче и более повторяемым, чем я буду ожидать.

Методы используются

Это было некоторое время, так как я записал, что ответ, таким образом, я не на 100% уверен теперь, но первое, что пришло на ум я думаю, что использовал этот метод:

$ pkill -f :

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

$ pkill -P <PPID>

Это - идентификатор родительского процесса (PPID) от того, куда fork-бомба была выполнена. Тот метод взял бы все дочерние процессы вниз, которые заставят их всех располагаться каскадом и умирать.

3
27.01.2020, 20:17
  • 1
    +1 при предоставлении подсказки о том, как оптимально уничтожить весь ;) –  goldilocks 12.10.2013, 21:10
  • 2
    @goldilocks - видят обновления. –  slm♦ 12.10.2013, 21:22
  • 3
    :) при помещении ветвления в сценарий, который зовет себя по имени, Вы могли также сделать что-то как while ((1)); do killall myscript.sh; done. –  goldilocks 14.10.2013, 17:49
  • 4
    @goldilocks - хорошая идея. –  slm♦ 14.10.2013, 17:51

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

killall -STOP -u user1
killall -KILL -u user1
2
27.01.2020, 20:17

Теги

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