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 , sh
die Eltern ist sudo
wie 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.
lsof
Ausgabe zeigt jedes Mal eine neue PID. Der Prozess wird einfach neu gestartet.Antworten:
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
SIGKILL
ist 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 vonps faux
(procps
zumindest 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).quelle
sh
wessen Elternteil istsudo
. Ist es in Ordnung, sie zu töten?procps
ich die Ausgabe von normalerweiseps -faux
als 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).ps -faux
hat geholfen, vom Elternteil zu töten. Können Sie bitte Ihre Antwort mit der Lösung aus dem Kommentar aktualisieren?ps faux
half zu erkennen,supervisord
welche endlos neu gestartet Laravel Queue DaemonWenn Sie den Listening-Port des Prozesses kennen, können Sie ihn
fuser
mit-k
flag verwenden.Etwas wie,
quelle