mata loop do bash executado a partir da linha de comando [duplicate]

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?

    
por Zaboj Campula 25.11.2015 / 15:06

3 respostas

3

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 .

    
por 25.11.2015 / 15:20
1

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.

    
por 25.11.2015 / 15:25
0

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)

    
por 25.11.2015 / 15:10