Motivo para trabalhos SIGTERM no caso de o shell estar fechado

2

Eu tenho visto trap 'kill $(jobs -p)' EXIT em scripts de shell que enviam SIGTERM para todas as tarefas do shell quando este shell é fechado. Se alguém executa um script bash, o novo shell bash é iniciado. Por exemplo, aqui o usuário executa ./trap_test.sh e isso cria uma instância do bash com PID 98959 :

 | |     |-+= 05624 user /usr/local/bin/bash
 | |     | \-+= 98959 user /bin/bash ./trap_test.sh
 | |     |   \--- 98960 user sleep 10

Em que circunstâncias é possível que o trabalho ainda esteja em execução enquanto o shell pai está fechado? No exemplo acima, se eu matar o PID 98959, o PID 98960 será eliminado automaticamente. trap 'kill $(jobs -p)' EXIT parece ser inútil para mim, já que todos os processos filhos devem ser mortos de qualquer maneira quando a própria shell está fechada.

    
por Martin 12.11.2015 / 15:29

1 resposta

2

Se o subprocesso for iniciado com nohup, ele permanecerá ativo depois que o shell pai sair / morrer, ou seja, depois de toda a finalidade do comando nohup.

Outra possibilidade é se o script ou processo manejar o (s) sinal (is) de kill (obviamente não matar -9) e o ignorar, então se você iniciá-lo como uma tarefa em background ele não morrerá quando o shell atual sair. / p>

exemplo:

 #!/bin/bash

 function trap_handler
 {
     echo "SORRY! I am not going down MUAHAHA!"
 }

 trap trap_handler SIGINT SIGTERM SIGHUP 

 while true
 do
      sleep 60
 done

Então, se eu começar isso como uma tarefa em segundo plano e tentar matá-lo, é o que acontece:

 $ ps -ef | grep test &
 $ jobs
 [1]+  Running                 ./test_trap.sh &
 $ kill %1
 $ Terminated
 SORRY! I am not going down MUAHAH!

 $ jobs
 [1]+  Running                 ./test_trap.sh &

Ok, agora vamos monitorar o processo a partir de um terminal diferente e observar o que acontece quando eu saio do terminal / shell em que o script foi iniciado:

 $ pstree -clap 26163
 bash,26163
  └─test_trap.sh,26175 ./test_trap.sh
       └─sleep,26183 60
 ## exited the original terminal window with exit
 $ pstree -clap 26163
 $ 
 $ pstree -clap 26175
 test_trap.sh,26175 ./test_trap.sh
   └─sleep,26185 60

O processo do terminal não existe mais, mas quando eu faço um pstree no ID do processo para o test_trap.sh que foi iniciado, ele e seus subprocessos ainda estão lá.

    
por 12.11.2015 / 17:03

Tags