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.
Tags kill linux scheduling trap