Problème
Je voudrais tuer un processus appelé raspivid (programme qui enregistre des vidéos à l'aide d'un appareil photo Raspberry Pi) mais je ne peux pas ...
Voici comment je l'appelle:
#!/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 je recherche ce processus, il est toujours 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
Si j'essaye de le tuer, il ne meurt pas. Au lieu de cela, il change le PID parent en 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
Observations:
- L'appel fonctionne bien pendant un certain temps (2 heures ou quelque chose), puis il commence à se bloquer.
- Seule une mise hors tension physique résout le problème. Je ne peux pas redémarrer via le terminal (il se bloque aussi)
Mes questions:
- Pourquoi Linux attribue-t-il le PID parent à 1?
- Pourquoi le processus ne peut-il pas être tué? (J'ai aussi essayé
sudo kill -9 7238
)
killall
tue apparemment le parent, pas le processus qu'il voulait.<defunct>
dans saps
sortie? Qu'est-ce que cela a à voir avec cette question?$!
ilkill -9
sans attendre le processus d'arrière-plan avec un appareil photo ... après unsleep 16
ilkill -9
le parent , brusquement à nouveau. Ça sentait le .zombie ... Suite à l'odeur (:-)) vous pouvez voir qu'avec ceps -ef
qu'il a fait, l'enfant est toujours vivant, mais le parent a été tué (-9).kill -9
son propre processus. Il est raisonnable de supposer qu'il est tué et <défunt> ... encore plus après l'appel non effectifsudo killall raspivid
. Il est même possible queraspivid
ses propres processus enfants soient orphelins. BTW il suffit de faire "ps -aux | grep Z" pour voir s'il s'agit d'un zombie ou non, et cela devrait être (assez) pour éviterkill -9
le processus dans le script principal.Pour répondre à la question numéro 1:
Lorsqu'un processus engendre des processus enfants, les enfants ont chacun leur propre PID. Le PPID de chaque enfant (id de processus parent) est le PID de leur processus parent. Si le parent décède, les processus enfants sont orphelins. Les processus orphelins sont automatiquement récupérés par le processus d'initialisation du système qui a un PID de 1.
la source
Le programme a probablement l'appareil photo ouvert, et en le tuant de force, vous ne lui avez pas permis de nettoyer correctement, alors maintenant il est bloqué.
Quelques observations:
-t 15000
au programme pour spécifier la durée de la vidéo, donc le premier kill ne devrait pas être nécessaire. Le deuxième kill est également inutile car le shell se terminera de lui-même lorsqu'il atteindra la fin du script. Si le programme ne se termine pas de lui-même (comme il se doit), vous avez d'autres problèmes.la source