Прерывание цикла for-loop в bash, но только после завершения итерации?

Есть ли способ прервать / остановить for -loop в bash , но только после завершения текущей итерации – т.е. "между" сделано и делать ?

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

(Да, я знаю, что я мог бы добавить sleep или команду read прежде чем сделать – но я этого не сделал , и цикл уже запущен …)

2 Solutions collect form web for “Прерывание цикла for-loop в bash, но только после завершения итерации?”

Для уже запущенного : предполагается, что команда является программой и, таким образом, выполняется как дочерний процесс под оболочкой, на которой запущен скрипт (или его часть), и скрипт не дал ему heredoc или herestring для ввода или прочитал или, по крайней мере, буферизованный этот вход, вы можете остановить после завершения процесса :

  • kill -STOP shell (так что после текущей команды он ничего не сделает)
  • подождать, пока процесс ребенка закончится и появится зомби
  • kill -KILL оболочка

(Все как один и тот же пользователь или root , из другой оболочки, конечно.) Если тело do ... done делает две или более вещи на каждой итерации, это только улавливает ее после программы, которая занимает достаточно много времени в реальном времени. может получить -STOP , что может быть или не быть последней программой на итерации.

В некоторых (много?) Случаях он будет работать, чтобы просто kill -KILL оболочку спереди, что предотвращает очистку оболочки своих детей, как обычно, и позволяет ребенку запускаться и, наконец, получать init (или эквивалент в вашей системе) , Однако это может привести к тому, что ребенок увидит некоторые ошибки ввода / вывода или различия в среде или ошибки или варианты с любыми внуками, которые он имеет, и это может все еще вызвать «деструктивные» результаты, которые вы пытаетесь избежать.

В зависимости от того, что содержит итерация и как она построена, вы можете отключить исполняемые файлы, а затем сломать скрипт. Например, сценарий выглядит следующим образом:

 do_first_thing && \ do_second_thing && \ do_third_thing 

Предполагая, что вы можете do_first_thing / переместить do_first_thing во всем мире, то есть, когда ни один другой скрипт не нуждается в этом в настоящий момент, вы:

  • отмените его или переименуйте, чтобы сценарий не запустил его
  • смотреть в ps прогресс итерации
  • когда цикл начинает простаивать, вы можете его убить.

Вы также можете связать первую команду в скрипте с другим скриптом, содержащим sleep или read что даст вам время и возможность безотлагательно отключить цикл.

  • Как выполнить несколько команд вместе в фоновом режиме?
  • Перезагрузка zsh при изменении размера окна терминатора
  • Скрипт для сравнения с файлами Excel и различиями печати
  • Правильный способ распространения сценариев оболочки
  • Почему $ # всегда 0 в моей функции?
  • Разноцветный Греп
  • Как сделать `cd dir / filename` взять меня в директорию?
  • Возможно ли создать среду Linux без традиционной командной оболочки?
  • Как очистить расширения файлов?
  • Извлечение информации о трассировке с помощью gawk
  • Программирование оболочки, исключая временные файлы
  • Как переключиться с bash на zsh?
  • Linux и Unix - лучшая ОС в мире.