У меня есть команда, которую я хочу запускать автоматически каждый раз, когда она завершается, поэтому я запустил что-то вроде этого:
while [ 1 ]; do COMMAND; done;
но если я не могу остановить цикл, так Ctrl-cкак это просто убивает, COMMAND
а не весь цикл.
Как мне добиться чего-то подобного, но что я могу остановить, не закрывая терминал?
Ответы:
Проверьте статус выхода команды. Если команда была прервана сигналом, код выхода будет 128 + номер сигнала. Из онлайн-документации GNU для bash :
POSIX также указывает, что значение команды, оканчивающейся сигналом, больше 128, но, похоже, не указывает ее точное значение, как это делает GNU:
Например, если вы прервете команду с control-C, код выхода будет 130, потому что SIGINT - это сигнал 2 в системах Unix. Так:
источник
paplay alert.ogg
, возможно, потому чтоpaplay
обрабатывает сигнал?Вы можете остановиться и поставить свою работу в фоновом режиме, пока она выполняется с помощью ctrl+ z. Тогда вы можете убить свою работу с:
Где [1] - номер вашей работы.
источник
Я бы сказал, что было бы лучше поместить ваш бесконечный цикл в скрипт и обрабатывать там сигналы. Вот основная отправная точка . Я уверен, что вы захотите изменить его под себя. Использует сценарий
trap
поймать ctrl- c(илиSIGTERM
), убивает команду (я использовалsleep
здесь в качестве теста) и завершает работу.источник
trap "exit 0" SIGINT SIGTERM; while true; do netcat -l -p 3000; done
trap
подход к тому же (bash) сценарию с бесконечным циклом, который нужно убить, используйте$$
вместо$!
(см. здесь )Я вообще просто удерживаю Ctrl-C. Рано или поздно он зарегистрируется между
COMMAND
's' и тем самым завершитwhile
цикл. Может быть, есть лучший способ.источник
paplay
в файле 1s.Если вы запустите bash с
-e
ним, то выйдете из-за ошибок:источник
Почему бы не просто,
Или когда используется в сценарии,
источник
Я предпочитаю другое решение:
Чтобы убить цикл, просто сделайте:
источник
while :
создаст бесконечный цикл и спасет вас от написания[ 1 ]
Это напечатает PID. Если вы выйдете из своего приглашения с помощью,
ctrl+d
тогда фоновое задание не будет завершено, и вы сможете позже убить задание из любого места, используяkill PID
Если вы потеряли отслеживание вашего PID, вы можете использовать
pstree -pa $USER
или,pgrep -fl '.*PROCESS.*'
чтобы помочь вам найти егоисточник
Используйте
trap
-источник