Wie finde und beende ich Remoteprozesse in Linux?

Wie finde und beende ich Remoteprozesse in Linux?

Ich entwickle einen Daemon, der nicht richtig funktioniert, und ich kann jetzt keine neuen Prozesse mehr erstellen (d. h. ich kann keinen neuen Prozess starten, um die anderen unerwünschten Prozesse zu beenden). Ich muss also in der Lage sein, die Prozesse von einem Remotecomputer aus zu beenden. Wie kann ich sie aus der Ferne „beenden“, ohne Administratorrechte zu haben? Wenn ich als normaler Benutzer meinen eigenen Prozess nicht von einem Remotecomputer aus beenden kann, sagen Sie es mir, damit ich es als richtige Antwort markieren kann.

Antwort1

Um einen auf einem Computer laufenden Prozess zu beenden, muss ein lokaler Prozess (oder der Kernel) das Beendigungssignal senden. Sie müssen also einen Prozess dazu bringen, dieses Signal auszugeben, und da Sie keinen neuen Prozess erstellen können, müssen Sie einen Weg finden, der ausschließlich auf bereits laufenden Prozessen basiert.

Es gibt keinen Standard-Daemon, der Ihnen dabei helfen kann. Sie alle würden Ihre Authentifizierung verarbeiten und dann einen neuen Prozess (z. B. eine Shell) starten, der unter Ihrem Namen ausgeführt wird. Wenn Sie also keinen Konsolenzugriff haben und keine bestehende Interaktion mit der Maschine durchführen, haben Sie Pech gehabt.


Aus Ihren Kommentaren geht hervor, dass Sie noch eine Shell auf dem Computer haben. Dann gibt es Dinge, die Sie tun können. Sie können keine externen Prozesse wie lsoder ausführen ps. Sie können jedoch integrierte Befehle wie echo, read, und ausführen kill( killist nicht in allen Shells integriert, aber in allen Shells, die Jobsteuerung unterstützen, wie Bash und Zsh).

Jeder Prozess hat ein zugeordnetes Verzeichnis unter /proc:, /proc/12345wobei 12345 die Prozess-ID ist. Sie können also einige Informationen zum Vorhandensein erhalten, indem Sie erkunden /proc. echomit Platzhaltern ist hier hilfreich, z. B. cd /proc; echo [0-9]*zeigt es die Prozess-IDs aller laufenden Prozesse an. Wenn die Shell zsh ist, können Sie mit Glob-Qualifizierern viel erreichen; es echo /proc/*(u$UID)zeigt z. B. nur die Prozesse an, die unter Ihrer Benutzer-ID laufen.

Eine Möglichkeit, den Inhalt einer Datei anzuzeigen, ohne sie aufzuspalten, ist

while read -r line; do
  echo "$line"
done </path/to/file

Sie können mehrere Prozesse gleichzeitig beenden, indem Sie sie alle an übergeben kill. Wenn Sie einen Prozess identifiziert haben, der zu Ihrem Daemon gehört, versuchen Sie, seine Prozessgruppe mit zu beenden, kill -9 -PGIDwobei PGIDdie Prozess-ID des Gruppenleiters ist. Sie können die Prozessgruppen-ID des Prozesses 123 mit finden </proc/123/stat read pid tcomm state ppid pgrp sid more; echo $pgrp. (Dieselbe Information ist in einer besser lesbaren Form in vorhanden, /proc/123/aber Sie sind nicht in der Lage, sie zu lesen.) Sie können auch versuchen, ein Signal an alle Ihre Prozesse (einschließlich der ursprünglichen Shell) mit zu senden.

trap : NUM
kill -NUM -1

Wählen Sie für NUM andere Werte als KILL(9), damit der trapBefehl dazu führt, dass Ihre Shell das Signal ignoriert ( KILLkann nicht abgefangen werden).

Antwort2

Die folgenden Informationen wurden gefunden unterhttp://www.cyberciti.biz/faq/kill-process-in-linux-or-terminate-a-process-in-unix-or-linux-systems/

Beenden Sie Prozesse mit dem Kill-Befehl unter Linux/UNIX

Der Kill-Befehl funktioniert sowohl unter Linux als auch unter UNIX/BSD-ähnlichen Betriebssystemen.

Schritt 1: Zuerst müssen Sie die Prozess-PID (Prozess-ID) herausfinden.

Verwenden Sie den Befehl ps oder pidof, um die Prozess-ID (PID) herauszufinden. Syntax: ps aux | grep processname pidof processname

Wenn der Prozessname beispielsweise „lighttpd“ lautet, können Sie die Prozess-ID mit einem der folgenden Befehle ermitteln:

ps aux | grep lighttpdOutput

lighttpd  3486  0.0  0.1   4248  1432 ?        S    Jul31   0:00 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
lighttpd  3492  0.0  0.5  13752  3936 ?        Ss   Jul31   0:00 /usr/bin/php5-cg

ODER verwenden Sie den Befehl pidof, mit dem Sie die Prozess-ID eines laufenden Programms ermitteln können:

pidof lighttpd

Ausgabe

3486

Schritt 2: Prozess mit PID (Prozess-ID) beenden

Der obige Befehl gibt Ihnen die PID (3486) des Lighttpd-Prozesses an. Beenden Sie nun den Prozess mit dieser PID:

# kill 3486

ODER

# kill -9 3486

Wobei -9 ein spezielles Kill-Signal ist, das den Prozess beendet.

Beispiele für den Killall-Befehl

VERWENDEN SIE NICHT den Befehl killall auf UNIX-Systemen (nur Linux-Befehl). Sie können auch den Befehl killall verwenden. Der Befehl killall beendet Prozesse nach Namen (PID muss nicht gesucht werden):

# killall -9 lighttpd

Firefox-Prozess beenden:

# killall -9 firefox-bin

Wie ich bereits sagte, bewirkt killall auf UNIX-Systemen etwas anderes. Es beendet alle Prozesse und nicht nur bestimmte. Verwenden Sie killall nicht auf UNIX-Systemen (verwenden Sie kill -9).

Antwort3

Wie Sie in Ihrem Kommentar sagten, ist ein Administrator die einzige Person, die Ihnen an diesem Punkt helfen kann. Ich schlage vor, Sie erhaltendas Perl-Kochbuchund lesen Sie Abschnitt 16.19 für den richtigen Umgang mit Zombies.

verwandte Informationen