Beenden Sie einen Prozess, der ständig neu gestartet wird

16

Was ist, wenn 'kill -9' nicht funktioniert? oder Wie kann man ein Skript beenden, das neue Prozesse startet? hilft mir sowieso nicht weiter.

Ich habe ein Python-Skript, das automatisch mit einer anderen Prozess-ID startet , die denselben Port verwendet, wenn sie mit beendet wird sudo kill -9 <pid>.

$ lsof -i :3002
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  13242 ubuntu    3u  IPv4  64592      0t0  TCP localhost:3002 (LISTEN)
$ sudo kill -9 13242
$ lsof -i :3002
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  16106 ubuntu    3u  IPv4  74792      0t0  TCP localhost:3002 (LISTEN)
$ sudo kill 16106
$ lsof -i :3002
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python  16294 ubuntu    3u  IPv4  75677      0t0  TCP localhost:3002 (LISTEN)

Es ist kein Zombie-Prozess.

$ ps -Al

4 S     0 16289     1  0  80   0 - 12901 poll_s ?        00:00:00 sudo
4 S  1000 16293 16289  0  80   0 -  1100 wait   ?        00:00:00 sh
0 S  1000 16294 16293  0  80   0 - 34632 poll_s ?        00:00:00 python

Ich habe es sogar sudo pkill -f <processname>ohne Glück versucht . Es will nicht sterben.

Aktualisieren:

Es ist übergeordneter Prozess ist , shdie Eltern ist sudowie in der obigen Tabelle angegeben. Ich bin nicht sicher, ob es sicher ist, diese abrupt zu töten. Auch dies ist ein freigegebener Ubuntu-Server.

Lakshminarayanan Guptha
quelle
Sieht so aus, als ob es in Ordnung wäre zu sterben. Ihre lsofAusgabe zeigt jedes Mal eine neue PID. Der Prozess wird einfach neu gestartet.
Patrick
Ja, es will nicht für immer sterben. Wacht auf, als wäre es nie gestorben :(
Lakshminarayanan Guptha

Antworten:

25

Wird automatisch mit einer anderen Prozess-ID gestartet, bedeutet dies, dass es sich um einen anderen Prozess handelt. Daher gibt es einen übergeordneten Prozess, der seine untergeordneten Prozesse überwacht. Wenn einer stirbt, wird er vom übergeordneten Prozess erneut erzeugt. Wenn Sie den Dienst vollständig beenden möchten, erfahren Sie, wie Sie den übergeordneten Prozess beenden können. Es mit zu töten SIGKILList natürlich eine der Optionen, aber wahrscheinlich nicht The Right One TM , da der Dienstmonitor möglicherweise eine Bereinigung durchführen muss, um ordnungsgemäß herunterzufahren.

Um den Monitorprozess zu finden, müssen Sie möglicherweise die gesamte Prozessliste überprüfen, da sich die tatsächlichen Listener möglicherweise von ihren übergeordneten Listenern (normalerweise durch die fork() + setsid()Kombination) distanzieren . In diesem Fall finde ich die Ausgabe von ps faux( procpszumindest für andere Implementierungen unterschiedlich) ziemlich praktisch - sie listet alle Prozesse in einem hierarchischen Baum auf. Sofern es keinen PID-Wrap gab (siehe auch Wikipedia ), sollte die Monitor-PID kleiner sein als die PID eines der Listener (es sei denn, Sie treffen natürlich einen PID-Wraparound).

peterph
quelle
Sein Elternteil ist, shwessen Elternteil ist sudo. Ist es in Ordnung, sie zu töten?
Lakshminarayanan Guptha
Übergeordneter von welchem ​​Prozess? Der, der an Port 3002 lauscht? In diesem Fall listen Sie alle Prozesse auf und raten Sie, welcher der Monitor ist. Unter Linux empfinde procpsich die Ausgabe von normalerweise ps -fauxals informativ genug. Beachten Sie auch, dass die PID des Monitors kleiner sein sollte als die PID des tatsächlichen Listeners (es sei denn, Sie haben das System für einige Zeit in Betrieb und die PIDs wurden bereits nach dem Start des Dienstes eingepackt).
Peterph
Groß. ps -fauxhat geholfen, vom Elternteil zu töten. Können Sie bitte Ihre Antwort mit der Lösung aus dem Kommentar aktualisieren?
Lakshminarayanan Guptha
Ja, ich habe darüber nachgedacht ... :)
Peterph
ps fauxhalf zu erkennen, supervisordwelche endlos neu gestartet Laravel Queue Daemon
aufgehängt
4

Wenn Sie den Listening-Port des Prozesses kennen, können Sie ihn fusermit -kflag verwenden.

Etwas wie,

fuser -k 3002/tcp
Ramesh
quelle