Wie kann ich alle Prozesse eines Benutzers mithilfe seiner UID beenden?

41

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?

user489152
quelle
6
Möchten Sie ein Tool dafür haben (pkill, slay, andere existieren) oder möchten Sie es selbst schreiben? In diesem Fall ist der Superuser-Stapelaustauschstandort wahrscheinlich besser. In letzterem Fall ist das Scannen / Bearbeiten und Notieren aller Vorgänge durch einen bestimmten Benutzer der richtige Weg. Der Quellcode für das Hilfsprogramm pkill zeigt beispielsweise, wie das geht.
Können Sie im Lichte des Kommentars von @ LarsWirzenius klarstellen, worum es bei dieser Frage ging? Vielen Dank!
Caleb
@Caleb: Ich wollte Prozesse abbrechen, indem ich das / proc las, da ich kein Tool kannte, das das macht. Auch jetzt stelle ich fest, dass andere als "kill", "pkill", "skill" usw. nicht auf meinem System verfügbar sind. In diesem Fall muss ich wohl nach Alternativen für Shellskripte suchen, um das / proc zu lesen und einen Weg zu finden, Prozesse unter einem Benutzer abzurufen. Irgendwelche Ideen?
User489152
1
In Bezug auf "die statische Liste aller UIDs ... damit ich überprüfen kann, ob dieser Benutzer existiert": Es gibt keine Möglichkeit, eine Benutzer-ID zu überprüfen. Benutzernamen stammen aus einer Datenbank, aber Benutzer-IDs sind von einem ausgeführten Prozess setuid()abhängig.
Gilles 'SO- hör auf böse zu sein'

Antworten:

52

Verwenden Sie pkill -U UIDoder pkill -u UIDoder Benutzername anstelle von UID. Manchmal skill -u USERNAMEkann es funktionieren, ein anderes Tool ist killall -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

pkill - ... signalisiert Prozesse basierend auf Namen und anderen Attributen

    -u, --euid euid,...
         Only match processes whose effective user ID is listed.
         Either the numerical or symbolical value may be used.
    -U, --uid uid,...
         Only match processes whose real user ID is listed.  Either the
         numerical or symbolical value may be used.

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

skill, snice ... Diese Tools sind veraltet und nicht mehr portierbar. Die Befehlssyntax ist schlecht definiert. Erwägen Sie die Verwendung von killall, pkill

  -u, --user user
         The next expression is a username.

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

killall - Prozesse mit Namen beenden

   -u, --user
         Kill only processes the specified user owns.  Command names
         are optional.

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 /procdigitale Unterordner durchlaufen und jeden gefundenen Prozess auf Übereinstimmung überprüfen.

Verwenden getpwentSie, um eine Benutzerliste abzurufen (es wird ein Benutzer pro Anruf abgerufen).

Die Tools skill (procps & procps-ng) und killall (psmisc) verwenden beide einen getpwnamBibliotheksaufruf, um das Argument der -uOption zu analysieren , und nur der Benutzername wird analysiert. pkill(procps & procps-ng) verwendet sowohl atol als auch getpwnam , um -u/ -Uargument zu analysieren und sowohl numerische als auch textuelle Benutzerspezifikationen zuzulassen.

osgx
quelle
1
pkill ist nicht überholt. Außerhalb von Linux ist es möglicherweise nicht portierbar, aber die Frage betraf speziell Linux.
1
Um die Liste der Benutzer zu erhalten, verwenden Sie den folgenden Einzeiler: getent passwd | awk -F: '{print $ 1}'
Petesh
Was ist mit einem Befehl wie: "kill -ju UID" von C System () aufrufen?
1
ist es ein eingebettetes Linux? Sie haben keine Fähigkeiten, Pkill und Killall? Sogar die in busybox eingebettete Shell hat pkill und killall.
osgx
2
killall -u USERNAMEarbeitete wie Charme
michalzuber
8

Wenn Sie -1 als Argument für die Prozess-ID an den killShell-Befehl oder die killC-Funktion übergeben , wird das Signal an alle Prozesse gesendet, die er erreichen kann. In der Praxis sind dies alle Prozesse des Benutzers, der den killBefehl oder Syscall ausführt.

su -c 'kill -TERM -1' bob

In C (Fehlerprüfung weggelassen):

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}
Gilles 'SO - hör auf böse zu sein'
quelle
5

Wenn die Funktion pkill in Ihrer UNIX / Linux-Distribution nicht verfügbar ist, können Sie als Root-Benutzer den folgenden Befehl ausführen:

ps -ef | grep username | grep -v grep | awk '{print $2}' | xargs kill

Dabei ist Benutzername der Benutzer, dessen Prozesse Sie löschen möchten

Gemeinschaft
quelle
oder einfach die pkill -U username.
Osgx
2
pgrep -U username|xargs kill -9
Alexander
quelle
0

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:

ps U <username> | cut -d " " -f 1 | xargs kill
jasonrhaas
quelle