Eu tenho um comando que eu quero executar novamente automaticamente sempre que termina, então executei algo como isto:
while [ 1 ]; do COMMAND; done;
mas se eu não conseguir parar o loop Ctrl-c, isso simplesmente mata COMMAND
e não o loop inteiro.
Como eu conseguiria algo semelhante, mas que eu posso parar sem precisar fechar o terminal?
Respostas:
Verifique o status de saída do comando. Se o comando foi finalizado por um sinal, o código de saída será 128 + o número do sinal. Na documentação on-line do GNU para bash :
O POSIX também especifica que o valor de um comando finalizado por um sinal é maior que 128, mas não parece especificar seu valor exato como o GNU:
Por exemplo, se você interromper um comando com o controle-C, o código de saída será 130, porque SIGINT é o sinal 2 nos sistemas Unix. Assim:
fonte
paplay alert.ogg
, talvez porquepaplay
lida com o sinal?Você pode parar e colocar seu trabalho em segundo plano enquanto ele estiver sendo executado usando ctrl+ z. Então você pode matar seu trabalho com:
Onde [1] é o seu número de trabalho.
fonte
Eu diria que talvez seja melhor colocar seu loop infinito em um script e manipular sinais lá. Aqui está um ponto de partida básico . Tenho certeza que você deseja modificá-lo para se adequar. O script usa
trap
para pegar ctrl- c(ouSIGTERM
), mata o comando (eu useisleep
aqui como teste) e sai.fonte
trap "exit 0" SIGINT SIGTERM; while true; do netcat -l -p 3000; done
trap
abordagem para o mesmo script (bash) com o loop infinito para ser morto, o uso$$
em vez de$!
(ver aqui )Eu geralmente apenas me seguro Ctrl-C. Mais cedo ou mais tarde, ele se registrará entre
COMMAND
's e, assim, encerrará owhile
loop. Talvez haja uma maneira melhor.fonte
paplay
em um arquivo 1s.Se você executar o bash,
-e
ele sairá em qualquer condição de erro:fonte
Por que não simplesmente,
Ou quando usado em um script,
fonte
Eu prefiro outra solução:
Para eliminar o loop, basta:
fonte
while :
criará um loop infinito e poupará você a escrever o[ 1 ]
Isso imprimirá o PID. Se você sair do prompt usando
ctrl+d
, o trabalho em segundo plano não será encerrado e, posteriormente, você poderá matá-lo de qualquer lugar usandokill PID
Se você perder o controle do seu PID, poderá usar
pstree -pa $USER
oupgrep -fl '.*PROCESS.*'
para ajudá-lo a encontrá-lofonte
Use
trap
-fonte