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 ls
oder ausführen ps
. Sie können jedoch integrierte Befehle wie echo
, read
, und ausführen kill
( kill
ist 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/12345
wobei 12345 die Prozess-ID ist. Sie können also einige Informationen zum Vorhandensein erhalten, indem Sie erkunden /proc
. echo
mit 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 -PGID
wobei PGID
die 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 trap
Befehl dazu führt, dass Ihre Shell das Signal ignoriert ( KILL
kann 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.