sigint não está sendo propagado para o processo filho em segundo plano

5

Eu preciso enviar o SIGINT para finalizar um processo normalmente, mas não consigo.

Este é um exemplo, porque o ambiente no qual a execução ocorre é 'desconhecido' (um script bash no travis.com)

Eu consegui (simular) o mesmo comportamento, lançando um processo como este (command &) &

vagrant@host:~$ (sleep 40 &) &
[1] 8473
vagrant@host:~$ ps -o pid,pgid,args
  PID  PGID COMMAND                     
 2787  2787 -bash                       
 8474  8473 sleep 40                    
 8490  8490 ps -o pid,pgid,args  
[1]+  Done                    ( sleep 40 & )
vagrant@host:~$ kill -INT 8474  ##### here I send SIGINT to the process
vagrant@host:~$ kill -INT -8473 ##### here I send SIGINT to the process group
vagrant@host:~$ ps -o pid,pgid,args
  PID  PGID COMMAND                     
 2787  2787 -bash                       
 8474  8473 sleep 40                    
 8559  8559 ps -o pid,pgid,args  

Eu pesquisei e li muito sobre sinais e grupos e não consigo entender o que está acontecendo aqui. O sinal está sendo ignorado em algum momento? O que está acontecendo? Como posso enviar o SIGINT para esse processo de 'suspensão'?

EDIT : se o SIGTERM é usado, o processo é eliminado (talvez a subcamada pai seja eliminada?)

    
por jperelli 19.01.2016 / 14:52

1 resposta

3

Para que um trabalho não interativo responda ao SIGINT, você precisa criar um manipulador para o SIGINT:

$ ( (trap "echo Got SigInt" SIGINT; sleep 60) & ) &
[1] 13619
$ 
[1]+  Done                    ( ( trap "echo Got SigInt" SIGINT; sleep 60 ) & )
$ ps -o pid,pgid,args
  PID  PGID COMMAND
11972 11972 bash
13620 13619 bash
13621 13619 sleep 60
13622 13622 ps -o pid,pgid,args
$ kill -INT 13620
$ kill -INT 13621
$ Got SigInt

Enviando SIGINT para o processo de suspensão

Como Stéphane Chazelas sugere nos comentários, se o objetivo é retornar ao comportamento padrão do SIGINT, podemos usar apenas trap - SIGINT . Por exemplo:

$ ( (trap - SIGINT; sleep 60) & ) &
[1] 16690
$ ps -o pid,pgid,args
  PID  PGID COMMAND
11972 11972 bash
16691 16690 bash
16692 16690 sleep 60
16693 16693 ps -o pid,pgid,args
[1]+  Done                    ( ( trap - SIGINT; sleep 60 ) & )
$ kill -INT 16692
$ ps -o pid,pgid,args
  PID  PGID COMMAND
11972 11972 bash
16698 16698 ps -o pid,pgid,args
    
por 19.01.2016 / 15:18