Problema
Me gustaría matar un proceso llamado raspivid (programa que graba videos usando una cámara Raspberry Pi) pero no puedo ...
Así es como lo llamo:
#!/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 $$
Si busco este proceso, todavía está allí:
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
Si trato de matarlo, no muere. En cambio, cambia el PID principal a 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
Observaciones:
- La llamada funciona bien por un tiempo (2 horas o algo así) luego comienza a colgar.
- Solo un apagado físico resuelve el problema. No puedo reiniciar a través de la terminal (también se cuelga)
Mis preguntas:
- ¿Por qué Linux asigna el PID primario a 1?
- ¿Por qué el proceso no puede ser asesinado? (También lo intenté
sudo kill -9 7238
)
killall
Aparentemente, el suyo está matando al padre, no el proceso que él quería.<defunct>
en sups
salida? ¿Qué tiene eso que ver con esta pregunta?$!
élkill -9
sin esperar el proceso de fondo con una cámara ... después desleep 16
él,kill -9
el padre , abruptamente de nuevo. Olía a zombie ... Siguiendo el olor (:-)) se puede ver que, con lo siguienteps -ef
que hizo, el niño aún estaba vivo, pero el padre fue asesinado (-9).kill -9
su propio proceso. Es razonable suponer que está muerto y <desaparecido> ... aún más después de la llamada no efectivasudo killall raspivid
. Incluso es posible queraspivid
genere sus propios procesos hijos que permanecen huérfanos. Por cierto, es suficiente hacer "ps -aux | grep Z" para ver si es zombie o no, y debería ser (suficiente) para evitarkill -9
el proceso en el script principal.Para responder la pregunta número 1:
Cuando un proceso genera procesos secundarios, cada uno de ellos tiene su propio PID. El PPID de cada elemento secundario (ID del proceso principal) es el PID de su proceso principal. Si el padre muere, los procesos hijos quedan huérfanos. Los procesos huérfanos son recogidos automáticamente por el proceso de inicio del sistema que tiene un PID de 1.
fuente
El programa probablemente tenga abierto el dispositivo de la cámara, y al matarlo por la fuerza, no ha permitido que se limpie correctamente, por lo que ahora está atascado.
Algunas observaciones:
-t 15000
al programa para especificar la duración del video, por lo que la primera muerte debería ser innecesaria. La segunda muerte también es innecesaria ya que el shell saldrá por sí solo cuando llegue al final del script. Si el programa no sale por sí solo (como debería), entonces tienes otros problemas.fuente