Uma maneira simples de matar loops iniciada interativamente seria parar o comando ( Ctrl - Z ), que deve imprimir um número de trabalho, digamos [2]+ Stopped
, que você pode matar usando kill %2
.
Eu corro meu comando em um loop. Eu escrevi o loop diretamente para uma linha de comando bash:
$ while true; do mycommand; done
mycommand
é um comando que faz muito io e espera por eventos para não consumir muito tempo do processador.
Como posso interromper o loop? Quando pressiono ctrl-c
ou ctrl-\
, o mycommand é finalizado, mas é iniciado novamente imediatamente. Quando eu faço login em outro terminal e mato o comando, a situação é a mesma.
É possível interromper o loop sem matar a sessão de terminal?
Um pequeno histórico:
Seu comando mycommand
não reenvia SIGINT quando recebe um, e apenas termina em vez disso. Por causa disso, bash
instance executando o loop não pode determinar que CTRL + C foi usado para finalizar a execução, e assume que era apenas um atalho de teclado que você emitiu para mycommand
. Como seria indesejável terminar seu shell por causa de um atalho de teclado (imagine usar vi
, por exemplo), bash
apenas prossegue e executa outra iteração de loop.
A solução final seria corrigir mycommand
, para que ele se mate com SIGINT quando receber um, deixando bash
saber que ele deve parar também.
void sigint_handler(int sig)
{
// Execute your normal handler
signal(SIGINT, SIG_DFL); // don't catch the signal anymore
kill(getpid(), SIGINT); // kill itself with the same signal
}
Fonte: link
Se você não puder corrigir mycommand
, terá que fechar a sessão de terminal ou eliminar o processo bash
que faz o loop e a instância atual de mycommand
, nessa ordem.
Você quer ps -f. pstree também é muito útil. Dê uma olhada no PPID (pai PID).
$ps -f
UID PID PPID C STIME TTY TIME CMD
rui 7725 7722 0 13:30 pts/0 00:00:01 -bash
rui 8062 7725 0 14:09 pts/0 00:00:00 ps -f
$ pstree -g
star─starter (1600) ───charon (1603) ─┬─ {charon} (1603) {├─ {charon} (1603) {├─ {charon} (1603) {├─ {charon} (1603) {├─ {charon} (1603) {├─ {charon} (1603) {├─ {charon} (1603) {├─ {charon} (1603) {├─ {charon} (1603) {├─ {charon} (1603) {├─ {charon} (1603) {├─ {charon} (1603) {├─ {charon} (1603) {├─ {charon} (1603) {├─ {charon} (1603) {└─ {charon} (1603)
Tags command-line bash