Capture o sinal kill quando um processo estiver no estado S [sleep interruptible]

2

Este é o grupo de processos: ( ps -ejH )

 xxxx  xxxx  xxxx ?        00:00:00   sshd
 yyyy  yyyy  yyyy ?        00:00:00     sshd
 8713  8713  8713 pts/0    00:00:00       bash

 1234  1234  1234 ?        00:00:00   Process 1
 5678  1234  1234 ?        00:00:00     openvt
 3789  3789  3789 tty4     00:00:00       Python process

Os estados dos processos são:

Processo1: Ss [sono interrompido e líder da sessão]

openvt: S [sono interrompido]

processo python: Ss + [Interruptible Sleep e líder de sessão e processo em execução em primeiro plano]

Estou trabalhando no terminal / dev / pts0 [8713] bash.

Quando eu envio kill 1234 , ele mata process1 sozinho, mas não seu processo filho. Por isso, escrevi uma função no Process1 que mata seus subprocessos antes de sair de si.

Quando eu chamo essa função usando trap como:

trap function_name SIGTERM

e enviando kill 1234 ou kill -15 1234 ou kill -s TERM 1234 , a função trap não captura o sinal para chamar a função que escrevi.

novamente, quando eu remover o comando trap do process1 e chamar kill 1234 , ele mata o procces1.

Eu acho que o controle de execução está em openvt e não no process1 quando ambos estão rodando em background e por causa deste comando kill não é recebido pelo process1.

Agora, como fazer o process1 receber o comando kill?

PS: o openvt aqui abre um novo terminal virtual para executar o processo python. o comando usado para fazer isso é: openvt -f -s -c 4 -w python_process . O -w espera que o comando seja concluído.

Nota: Do linux-journal Se um processo receber um sinal quando estiver em um estado de suspensão interrompível, por exemplo , esperando pelo terminal I / O, o kernel irá despertar o processo para manipular o sinal. Se um processo receber um sinal quando estiver em modo ininterrupto de espera, como esperar por E / S de disco, o kernel adia o sinal até que o evento seja concluído.

O sinal de Kill que eu enviei para process1 está em estado de suspensão interrompível (S), mas o kernel adia o sinal. Por que?

Existe uma postagem baseada nisso, mas não foi solucionada.

update 1: Quando eu mato todos os processos filhos do processo pai usando o comando pkill -TERM -p pid e quando eu chamo kill pid, o sinal é capturado pelo comando trap.

    
por Langdon 09.03.2015 / 16:48

0 respostas