Простой путь состоит в том, чтобы работать:
!!echo %
!!
заменяет текущую строку результатом команды после него.
%
заменяется под названием отредактированный файл в команде, таким образом, это эффективно вставит то имя в отредактированном файле.
Имя файла является тем, которое Вы передали vi (m) команду и могли бы содержать относительный или полный путь. Если Вы хотите разделить его и только сохранить имя файла, работать
!!basename %
Там должен так или иначе остановить это, не перезагружая машину?
Это не совсем невозможно, и можно сделать это через удачу - т.е. Вам удается уничтожить все процессы, прежде чем другой будет порожден 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
) не будет почти наверняка работать в целом, но Вы могли попробовать. Я не, так как я хотел бы оставить свою систему, работающую на данный момент ;)
При разработке ответа для этого вопроса, названного: Где ветвление () на fork-бомбе :() {:|: и};:?, я соединил то, что я назвал, предохранитель задержал fork-бомбу, которую было легче уничтожить.
Дополнительно при разработке того ответа я регулярно смог остановить fork-бомбу путем уничтожения всех процессов. Это было легче и более повторяемым, чем я буду ожидать.
Это было некоторое время, так как я записал, что ответ, таким образом, я не на 100% уверен теперь, но первое, что пришло на ум я думаю, что использовал этот метод:
$ pkill -f :
Это остановило бы некоторое время ожидание процесса, но в конечном счете это смогло работать. Также я отметил бы идентификатор родительского процесса прежде, чем запустить fork-бомбу и сделаю это также:
$ pkill -P <PPID>
Это - идентификатор родительского процесса (PPID) от того, куда fork-бомба была выполнена. Тот метод взял бы все дочерние процессы вниз, которые заставят их всех располагаться каскадом и умирать.
while ((1)); do killall myscript.sh; done
.
– goldilocks
14.10.2013, 17:49