Ich möchte alle laufenden Prozesse eines bestimmten Benutzers entweder über ein Shell-Skript oder über systemeigenen Code auf einem Linux-System beenden.
Muss ich das Verzeichnis / proc lesen und danach suchen?
Irgendwelche Ideen? Gibt es eine dynamische Zuordnung der Pids unter UIDs in Linux? Ist das nicht in der Prozedur?
Wenn nicht, wo wird diese Liste aufbewahrt? Soll ich daraus lesen? Wo befindet sich auch die statische Liste aller UIDs im System, damit ich überprüfen kann, ob dieser Benutzer vorhanden ist, und dann alle Prozesse beenden kann, die unter ihm ausgeführt werden?
setuid()
abhängig.Antworten:
Verwenden Sie
pkill -U UID
oderpkill -u UID
oder Benutzername anstelle von UID. Manchmalskill -u USERNAME
kann es funktionieren, ein anderes Tool istkillall -u USERNAME
.Skill war Linux-spezifisch und ist mittlerweile veraltet, und pkill ist portabler (Linux, Solaris, BSD).
pkill erlaubt sowohl numerische als auch symbolische UIDs, effektive und echte http://man7.org/linux/man-pages/man1/pkill.1.html
Die Manpage von skill sagt, dass es nur erlaubt ist, den Benutzernamen zu verwenden, nicht die Benutzer-ID: http://man7.org/linux/man-pages/man1/skill.1.html
killall ist in Linux nicht als veraltet markiert, funktioniert aber auch nicht mit der numerischen UID. Nur Benutzername: http://man7.org/linux/man-pages/man1/killall.1.html
Ich denke, jedes Dienstprogramm, das zum Auffinden von Prozessen im Linux / Solaris-Stil / proc (procfs) verwendet wird, verwendet eine vollständige Liste von Prozessen (wobei einige readdir von ausgeführt werden
/proc
). Ich denke, sie werden/proc
digitale Unterordner durchlaufen und jeden gefundenen Prozess auf Übereinstimmung überprüfen.Verwenden
getpwent
Sie, um eine Benutzerliste abzurufen (es wird ein Benutzer pro Anruf abgerufen).Die Tools skill (procps & procps-ng) und killall (psmisc) verwenden beide einen
getpwnam
Bibliotheksaufruf, um das Argument der-u
Option zu analysieren , und nur der Benutzername wird analysiert.pkill
(procps & procps-ng) verwendet sowohl atol als auch getpwnam , um-u
/-U
argument zu analysieren und sowohl numerische als auch textuelle Benutzerspezifikationen zuzulassen.quelle
killall -u USERNAME
arbeitete wie CharmeWenn Sie -1 als Argument für die Prozess-ID an den
kill
Shell-Befehl oder diekill
C-Funktion übergeben , wird das Signal an alle Prozesse gesendet, die er erreichen kann. In der Praxis sind dies alle Prozesse des Benutzers, der denkill
Befehl oder Syscall ausführt.In C (Fehlerprüfung weggelassen):
quelle
Wenn die Funktion pkill in Ihrer UNIX / Linux-Distribution nicht verfügbar ist, können Sie als Root-Benutzer den folgenden Befehl ausführen:
Dabei ist Benutzername der Benutzer, dessen Prozesse Sie löschen möchten
quelle
pkill -U username
.quelle
Das hat bei mir gut funktioniert. Sie können alle PIDs der Prozesse nach Benutzername finden, indem Sie tun
ps U <username>
und von dort aus gehen. Versuche dies:quelle