Por que não consigo matar esse processo no Linux?

8

Problema

Gostaria de matar um processo chamado raspivid (programa que grava vídeos usando uma câmera Raspberry Pi), mas não posso ...

É assim que eu chamo:

#!/bin/bash

#Start recording...
raspivid -w 800 -h 600 -t 15000 -o $1 -v -n -rot 270 >> /home/pi/log/camera_output.txt 2>&1 &

#Waiting the video to be complete
sleep 16

#Killing child process
sudo kill -9 $!

#Killing parent process
sudo kill -9 $$

Se eu procurar por esse processo, ele ainda estará lá:

pi@raspberrypi ~ $ ps -ef | grep raspivid
root      7238     7234  0 21:53 ?        00:00:00 [raspivid]
pi       17096 14925  0 22:05 pts/0    00:00:00 grep --color=auto raspivid

Se eu tentar matá-lo, ele não morre. Em vez disso, altera o PID pai para 1:

pi@raspberrypi ~ $ sudo killall raspivid
pi@raspberrypi ~ $ ps -ef | grep raspivid
root      7238     1  0 21:53 ?        00:00:00 [raspivid]
pi       17196 14925  0 22:05 pts/0    00:00:00 grep --color=auto raspivid
pi@raspberrypi ~ $ sudo killall raspivid

Observações:

  1. A chamada funciona bem por um tempo (2 horas ou mais) e começa a desligar.
  2. Somente um desligamento físico resolve o problema. Não consigo reiniciar via terminal (trava também)

Minhas perguntas:

  1. Por que o Linux atribui o PID pai a 1?
  2. Por que o processo não pode ser morto? (Eu também tentei sudo kill -9 7238)

fonte

Respostas:

2

Problema

Seu script provavelmente está criando zumbis por causa de seus kill -9comandos; como sugerido pela resposta jjlin também nunca é uma boa prática para matar abruptamente algum processo sem ser forçado.

De man bashpodemos ler:

Processos marcados como <extinto> são processos mortos (os chamados " zumbis ") que permanecem porque seus pais não os destruíram corretamente . Esses processos serão destruídos pelo init (8) se o processo pai sair.

Resposta nº 1: O processo init possui o PID 1 e, para este Linux, atribui a eles o pai com o PID 1 (porque os atribui ao init ).

Resposta 2: Eles não podem ser mortos simplesmente porque estão mortos ... se o pai ou a mãe initprovavelmente é o suficiente para esperar algum tempo.

Para remover zumbis de um sistema, o sinal SIGCHLD pode ser enviado aos pais manualmente, usando o comando kill. Se o processo pai ainda se recusar a colher o zumbi, o próximo passo seria remover o processo pai. Quando um processo perde seu pai, o init se torna seu novo pai. O Init executa periodicamente a chamada do sistema de espera para colher quaisquer zumbis com o init como pai. [1]

Apenas no caso de esta ideia surge um dia ou outro: ao #kill -9 initprocesso com privilégios de root é o software equivalente a fisicamente desconecte o computador da rede elétrica. [:-)]

No entanto, os processos zumbis podem ser identificados na saída do pscomando pela presença de um "Z" na coluna STAT . Você pode usar a seguinte linha para identificá-los facilmente

ps -aux | grep Z

Algumas referências sobre o mundo dos zumbis do Linux :

Hastur
fonte
Um processo com o PID 1 pai não é um zumbi. Um processo obtém esse pai quando seu pai é morto antes dele. Então, killallaparentemente, ele está matando os pais, não o processo que ele queria.
Barmar 06/02
Onde você vê <defunct>na psprodução dele ? O que isso tem a ver com esta questão?
Barmar 06/02
@ Barmar eu não vi. Infelizmente, nem sempre o problema é exatamente onde você está procurando . BTW do $!que ele kill -9, sem esperar o processo de fundo com uma câmera ... depois de um sleep 16ele kill -9o pai , abruptamente novamente. Cheirava a .zumbi ... Após o cheiro (:-)) você pode ver que, com o seguinte ps -ef, a criança ainda está viva, mas o pai foi morto (-9).
Hastur 07/02
11
Eu acho que você está confundindo processos órfãos com processos zumbis, mas eles não são relacionados.
Barmar '07
Olhando novamente o script: ele tem kill -9seu próprio processo. É razoável supor que ele foi morto e <extinto> ... ainda mais após a chamada não efetiva sudo killall raspivid. É até possível que raspividgerem seus próprios processos filhos que permanecem órfãos. BTW, basta fazer "ps -aux | grep Z" para ver se é zumbi ou não, e deve ser (o suficiente) para evitar kill -9o processo no script principal.
217 Hastur
4

Para responder à pergunta número 1:

Quando um processo gera processos filhos, cada um deles tem seu próprio IDP. O PPID de cada filho (ID do processo dos pais) é o PID do processo pai. Se o pai morre, os processos filho ficam órfãos. Os processos órfãos são selecionados automaticamente pelo processo de inicialização do sistema que possui um PID de 1.

Glapworth
fonte
0

O programa provavelmente tem o dispositivo da câmera aberto e, ao matá-lo à força, você não permitiu que ele limpasse corretamente, agora está preso.

Algumas observações:

  • Geralmente, não é uma boa ideia interromper um programa começando com -9, a menos que você saiba o que está fazendo. Apenas uma morte normal (sem opções) é boa.
  • Não deve haver nenhuma necessidade de matar seu script. Você já passou -t 15000para o programa para especificar a duração do vídeo, portanto a primeira interrupção deve ser desnecessária. A segunda morte também é desnecessária, pois o shell sairá por conta própria quando chegar ao final do script. Se o programa não estiver saindo por conta própria (como deveria), você terá outros problemas.
jjlin
fonte