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:
- A chamada funciona bem por um tempo (2 horas ou mais) e começa a desligar.
- Somente um desligamento físico resolve o problema. Não consigo reiniciar via terminal (trava também)
Minhas perguntas:
- Por que o Linux atribui o PID pai a 1?
- Por que o processo não pode ser morto? (Eu também tentei
sudo kill -9 7238
)
killall
aparentemente, ele está matando os pais, não o processo que ele queria.<defunct>
naps
produção dele ? O que isso tem a ver com esta questão?$!
que elekill -9
, sem esperar o processo de fundo com uma câmera ... depois de umsleep 16
elekill -9
o pai , abruptamente novamente. Cheirava a .zumbi ... Após o cheiro (:-)) você pode ver que, com o seguinteps -ef
, a criança ainda está viva, mas o pai foi morto (-9).kill -9
seu próprio processo. É razoável supor que ele foi morto e <extinto> ... ainda mais após a chamada não efetivasudo killall raspivid
. É até possível queraspivid
gerem 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 evitarkill -9
o processo no script principal.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.
fonte
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:
-t 15000
para 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.fonte