Учитывая этот цикл:
while sleep 10s ; do
something-that-runs-forever
done
Когда я нажимаю Ctrl + C, весь цикл while прерывается. Я хочу прервать процесс «что-то», пропустить 10 секунд, а затем перезапустить «что-то».
Как сделать так, чтобы Ctrl + C влиял только на «что-то», а не на цикл while?
РЕДАКТИРОВАТЬ: «прерывать», как в SIGINT. Убийство. Прервать. Прервать. Не «прерывать», как в «паузе».
fg
? Зачем вообще использовать Ctrl + C?What I want to do is to interrupt the "something"-process, let 10 seconds pass, and then restart "something"
. Если вы нажмете Ctrl + Z, подождите 10 секунд и затем запуститеfg
, это именно то, что произойдет. Может быть, вы могли бы отредактировать свой вопрос и привести конкретный пример, чтобы мы могли лучше понять?Ответы:
Это должно работать, если вы просто
trap
SIGINT
к чему-то. Нравится:
(true
).Прерывание
something...
не заставляет оболочку выходить сейчас, поскольку она игнорирует сигнал. Однако, если вы запуститеsleep
процесс, он завершится с ошибкой, и цикл остановится из-за этого. Переместитеsleep
внутрь цикла или добавьте что-то подобное,|| true
чтобы предотвратить это.Обратите внимание, что если вы используете
trap "" INT
для полного игнорирования сигнала (вместо назначения ему команды), он также игнорируется в дочернем процессе, поэтому вы также не можете прерывать егоsomething...
. Это явно упоминается по крайней мере в руководстве Bash :источник
do (trap - INT; something-that-runs-forever)
разрешить прерывание команды. Кроме того , вам не нужно бежать:
- вы можете просто использовать пустую строку , чтобы игнорировать сигнал:trap '' INT
. Все это POSIX и должно работать на любой совместимой оболочке (не только на Bash).SIGINT
в полном объеме не является строго переносимой: « Реализации могут разрешать имена сSIG
префиксом или игнорировать регистр в именах сигналов как расширение . » (Мой акцент)trap "" INT
(также posix)trap :
вместо этого,trap ""
заключалась именно в том, чтобы не игнорировать сигнал (но вместо этого сделать его бездействующим ), так что нам не нужно ничего делать, чтобы иметь возможность прерывать основнуюsomething
программу.Другой вариант - заставить
something-that-runs-forever
обрабатывать сигнал (грациозно выходить при его получении). Конечно, это имеет смысл делать только тогда, когда эта программа используется во многих сценариях, а желаемое поведение на CTRL+ Cсистематически одинаково - продолжать выполнение сценария.источник