¿Por qué no puedo matar este proceso en Linux?

8

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:

  1. La llamada funciona bien por un tiempo (2 horas o algo así) luego comienza a colgar.
  2. Solo un apagado físico resuelve el problema. No puedo reiniciar a través de la terminal (también se cuelga)

Mis preguntas:

  1. ¿Por qué Linux asigna el PID primario a 1?
  2. ¿Por qué el proceso no puede ser asesinado? (También lo intenté sudo kill -9 7238)

fuente

Respuestas:

2

Problema

Su script probablemente esté creando zombies debido a sus kill -9comandos; como se sugiere en la respuesta de jjlin, nunca es una buena práctica matar abruptamente algún proceso sin verse obligado a hacerlo.

De man bashpodemos leer:

Los procesos marcados como <inactivos> son procesos muertos (llamados " zombies ") que permanecen porque sus padres no los han destruido adecuadamente . Init (8) destruirá estos procesos si sale el proceso padre.

Respuesta n. ° 1: El proceso init tiene el PID 1 y para este Linux les asigna el padre con PID 1 (porque los asigna a init ).

Respuesta # 2: No pueden ser asesinados simplemente porque están muertos ... si su padre initprobablemente es suficiente para esperar un tiempo.

Para eliminar zombies de un sistema, la señal SIGCHLD se puede enviar a los padres manualmente, utilizando el comando kill. Si el proceso padre todavía se niega a cosechar el zombi, el siguiente paso sería eliminar el proceso padre. Cuando un proceso pierde su padre, init se convierte en su nuevo padre. Init ejecuta periódicamente la llamada al sistema de espera para cosechar zombies con init como padre. [1]

Por si acaso esta idea surge un día u otro: a #kill -9 initproceso con privilegios de root es el software equivalente a físicamente Desenchufe el equipo de la red eléctrica. [:-)]

Sin embargo, los procesos zombie se pueden identificar en la salida del pscomando por la presencia de una "Z" en la columna STAT . Puede usar la siguiente línea para identificarlos fácilmente

ps -aux | grep Z

Algunas referencias sobre Linux zombies world :

Hastur
fuente
Un proceso con PID padre 1 no es un zombie. Un proceso obtiene este padre cuando su padre es asesinado antes que él. killallAparentemente, el suyo está matando al padre, no el proceso que él quería.
Barmar
¿Dónde ves <defunct>en su pssalida? ¿Qué tiene eso que ver con esta pregunta?
Barmar
@Barmar que no vi. Lamentablemente, no siempre el problema es exactamente dónde está buscando . Por cierto, $!él kill -9sin esperar el proceso de fondo con una cámara ... después de sleep 16él, kill -9el padre , abruptamente de nuevo. Olía a zombie ... Siguiendo el olor (:-)) se puede ver que, con lo siguiente ps -efque hizo, el niño aún estaba vivo, pero el padre fue asesinado (-9).
Hastur
1
Creo que estás confundiendo procesos huérfanos con procesos zombies, pero no están relacionados.
Barmar
Mirando de nuevo el guión: él es kill -9su propio proceso. Es razonable suponer que está muerto y <desaparecido> ... aún más después de la llamada no efectiva sudo killall raspivid. Incluso es posible que raspividgenere 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 evitar kill -9el proceso en el script principal.
Hastur
4

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.

glapworth
fuente
0

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:

  • Por lo general, no es una buena idea matar un programa comenzando con -9 a menos que sepa lo que está haciendo. Solo una muerte normal (sin opciones) está bien.
  • No debería haber ninguna necesidad de matar en su script en absoluto. Ya ha pasado -t 15000al 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.
jjlin
fuente