Como usar Ctrl + C para matar todos os processos em segundo plano iniciados em um script Bash?

5

ArchLinux (Manjaro).

Estou executando um arquivo bash. Ele executa 2 processos (comandos), usando & . Mas quando pressiono Ctrl + C para parar o programa - um processo morre e o outro continua a funcionar.

Como faço para parar os dois processos? Ou como eu escrevo um novo script para matar esses dois processos?

    
por Ievgen 27.08.2016 / 10:45

2 respostas

7

O e comercial "&" executa um comando em segundo plano em um novo processo. Quando seu processo pai (o comando que executa o script bash no seu caso) terminar, esse processo em segundo plano redefinirá seu processo pai para init (processo com PID 1), mas não morrerá. Quando você pressiona ctrl+c , você está enviando um sinal de interrupção para o processo em primeiro plano, e isso não afetará o processo em segundo plano.

Para eliminar o processo em segundo plano, você deve usar o comando kill com o PID do processo em segundo plano mais recente, que pode ser obtido por $! .

Se você quiser usar ctrl+c para matar o script e o processo em segundo plano, faça o seguinte:

trap 'kill $BGPID; exit' SIGINT
sleep 1024 &    # background command
BGPID=$!
sleep 1024      # foreground command of the script

trap modifica o manipulador de traps do SIGINT , então o script mata o processo com $BGPID antes de sair.

    
por 27.08.2016 / 11:42
1

Os programas podem ignorar Ctrl+c signal, pois eles também podem ignorar o SIGTSTP

Você pode tentar Ctrl+z na maioria dos shells (nem sempre, mas na maioria das vezes)

Existem alguns sinais que não podem ser ignorados pelo processo: SIGKILL, SIGSTOP. Você pode enviar o comando kill. Para matar o seu processo congelado, você tem que encontrar o ID do processo (PID). use pgrep ou ps e depois mate-o

 % kill -9 PID
    
por 29.08.2016 / 19:20