Problem
Ich möchte einen Prozess namens raspivid (Programm, das Videos mit einer Raspberry Pi-Kamera aufzeichnet) beenden, kann aber nicht ...
So nenne ich es:
#!/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 $$
Wenn ich nach diesem Prozess suche, ist er immer noch da:
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
Wenn ich versuche, es zu töten, stirbt es nicht. Stattdessen wird die übergeordnete PID in 1 geändert:
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
Beobachtungen:
- Der Anruf funktioniert eine Weile (2 Stunden oder so), dann beginnt er zu hängen.
- Nur ein physisches Ausschalten löst das Problem. Ich kann nicht über das Terminal neu starten (es hängt auch)
Meine Fragen:
- Warum weist Linux die übergeordnete PID 1 zu?
- Warum kann der Prozess nicht beendet werden? (Ich habe es auch versucht
sudo kill -9 7238
)
killall
tötet er anscheinend die Eltern, nicht den Prozess, den er wollte.<defunct>
in seinerps
Ausgabe? Was hat das mit dieser Frage zu tun?$!
erkill -9
ohne den Hintergrundprozess mit einer Kamera abzuwarten ... nach einemsleep 16
erkill -9
der Elternteil , wieder abrupt. Es roch nach .zombie ... Nach dem Geruch (:-)) kann man sehen, dassps -ef
das Kind mit dem folgenden noch lebte, aber der Elternteil getötet wurde (-9).kill -9
seinen eigenen Prozess. Es ist vernünftig anzunehmen, dass es getötet wurde und <nicht mehr existiert ... ... noch mehr nach dem nicht effektiven Anrufsudo killall raspivid
. Es ist sogar möglich, dassraspivid
eigene untergeordnete Prozesse entstehen, die verwaist bleiben. Übrigens reicht es aus, "ps -aux | grep Z" zu machen, um zu sehen, ob es sich um einen Zombie handelt oder nicht, und es sollte (genug) sein, umkill -9
den Prozess im Hauptskript zu vermeiden .Um Frage Nummer 1 zu beantworten:
Wenn ein Prozess untergeordnete Prozesse erzeugt, haben die untergeordneten Prozesse jeweils ihre eigene PID. Die PPID jedes Kindes (Prozess-ID des Elternteils) ist die PID des übergeordneten Prozesses. Wenn der Elternteil stirbt, sind die untergeordneten Prozesse verwaist. Verwaiste Prozesse werden automatisch vom Systeminitiierungsprozess mit einer PID von 1 erfasst.
quelle
Das Programm hat wahrscheinlich das Kameragerät geöffnet, und wenn Sie es gewaltsam beenden, haben Sie nicht zugelassen, dass es ordnungsgemäß aufgeräumt wird. Jetzt steckt es fest.
Einige Beobachtungen:
-t 15000
das Programm übergeben, um die Länge des Videos anzugeben, sodass der erste Kill nicht erforderlich sein sollte. Der zweite Kill ist ebenfalls nicht erforderlich, da die Shell am Ende des Skripts von selbst beendet wird. Wenn das Programm nicht von alleine beendet wird (wie es sollte), haben Sie andere Probleme.quelle