Warum kann ich diesen Prozess unter Linux nicht beenden?


8

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:

  1. Der Anruf funktioniert eine Weile (2 Stunden oder so), dann beginnt er zu hängen.
  2. Nur ein physisches Ausschalten löst das Problem. Ich kann nicht über das Terminal neu starten (es hängt auch)

Meine Fragen:

  1. Warum weist Linux die übergeordnete PID 1 zu?
  2. Warum kann der Prozess nicht beendet werden? (Ich habe es auch versucht sudo kill -9 7238)

Antworten:


2

Problem

Ihr Skript erstellt wahrscheinlich aufgrund Ihrer Befehle Zombieskill -9 . Wie aus der Antwort von jjlin hervorgeht, ist es auch nie eine gute Praxis, einen Prozess abrupt abzubrechen , ohne dazu gezwungen zu werden.

Aus können man bashwir lesen:

Mit <defunct> gekennzeichnete Prozesse sind tote Prozesse (sogenannte " Zombies "), die verbleiben, weil ihre Eltern sie nicht ordnungsgemäß zerstört haben . Diese Prozesse werden von init (8) zerstört, wenn der übergeordnete Prozess beendet wird.

Antwort # 1: Der Prozess init das hat PID 1 und für diese Linux ordnet sie die Eltern mit PID 1 (weil es ihnen zuweisen init ).

Antwort 2: Sie können nicht einfach getötet werden, weil sie einfach tot sind ... wenn ihre Eltern initwahrscheinlich genug sind, um einige Zeit zu warten.

Um Zombies aus einem System zu entfernen, kann das SIGCHLD-Signal mithilfe des Befehls kill manuell an das übergeordnete Signal gesendet werden. Wenn der übergeordnete Prozess sich immer noch weigert, den Zombie zu ernten, besteht der nächste Schritt darin, den übergeordneten Prozess zu entfernen. Wenn ein Prozess sein übergeordnetes Element verliert, wird init zu seinem neuen übergeordneten Element. Init führt den Aufruf des Wartesystems regelmäßig aus, um alle Zombies mit init als übergeordnetem Element zu ernten. [1]

Nur für den Fall dieser Idee entsteht ein Tag oder eine andere: zum #kill -9 initProzess mit Root - Rechten die Software entspricht physisch trennt den Computer vom Stromnetz ist. [:-)]

Jedoch zombie Prozesse können in der Ausgabe von identifiziere psBefehl durch das Vorhandensein eines „Z“ in der STAT - Spalte. Sie können die folgende Zeile verwenden, um sie leicht zu identifizieren

ps -aux | grep Z

Einige Referenzen zur Welt der Linux-Zombies :


Ein Prozess mit der übergeordneten PID 1 ist kein Zombie. Ein Prozess erhält dieses Elternteil, wenn sein Elternteil getötet wird, bevor es getötet wird. Also killalltötet er anscheinend die Eltern, nicht den Prozess, den er wollte.
Barmar

Wo sehen Sie <defunct>in seiner psAusgabe? Was hat das mit dieser Frage zu tun?
Barmar

@Barmar habe ich nicht gesehen. Leider ist das Problem nicht immer genau dort, wo Sie suchen . Übrigens von dem $!er kill -9ohne den Hintergrundprozess mit einer Kamera abzuwarten ... nach einem sleep 16er kill -9der Elternteil , wieder abrupt. Es roch nach .zombie ... Nach dem Geruch (:-)) kann man sehen, dass ps -efdas Kind mit dem folgenden noch lebte, aber der Elternteil getötet wurde (-9).
Hastur

1
Ich denke, Sie verwechseln verwaiste Prozesse mit Zombie-Prozessen, aber sie haben nichts miteinander zu tun.
Barmar

Schauen Sie sich noch einmal das Drehbuch an: Er hat kill -9seinen eigenen Prozess. Es ist vernünftig anzunehmen, dass es getötet wurde und <nicht mehr existiert ... ... noch mehr nach dem nicht effektiven Anruf sudo killall raspivid. Es ist sogar möglich, dass raspivideigene 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, um kill -9den Prozess im Hauptskript zu vermeiden .
Hastur

4

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.


0

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:

  • Es ist im Allgemeinen keine gute Idee, ein Programm mit -9 zu beenden, es sei denn, Sie wissen, was Sie tun. Nur ein normaler Kill (ohne Optionen) ist in Ordnung.
  • Es sollte überhaupt nicht notwendig sein, in Ihrem Skript zu töten. Sie haben bereits an -t 15000das 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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.