töte alle Prozesse eines Benutzers mit Ausnahme einiger weniger in Linux

11262
Tim

Ich habe einige Prozesse unter einer Bildschirmsitzung auf einem Remote-Server ausgeführt. Als ich versuchte, alle diese Prozesse zu beenden, durch:

pkill -U tim 

Alle meine Prozesse werden abgebrochen, auch die, die ich nicht töten möchte (z. B. Bildschirm und SSH-Verbindung).

Gibt es eine Möglichkeit, alle meine Prozesse außer der Bildschirm- und SSH-Verbindung zu beenden?

5

5 Antworten auf die Frage

11
Roy Rico

Ein bisschen Hackerisch:

ps -U tim | egrep -v "ssh|screen" | cut -b11-15 | xargs -t kill 

Dadurch wird alles außer ssh oder Screen-Prozessen abgebrochen. Hier sind die Befehle erklärt:

  • ps -U tim - wird natürlich jeden Prozess vom Benutzer tim auflisten
  • egrep -v "ssh|screen" - Entfernt Zeilen mit SSH- oder Bildschirmprozessen
  • cut -b11-15 - schneidet die Daten in den Spalten 11-15 (normalerweise befindet sich dort die PID)
  • xargs -t kill - Übergibt alle Prozess-IDs an den Kill-Befehl

Sie können auch awk verwenden, wenn Sie daran gewöhnt sind.

ps -U tim | egrep -v "ssh|screen" | awk '' | xargs -t kill 
1
djhowell

Nichts eingebaut in das ich weiß. Sie könnten ein Skript wie folgt erstellen:

#!/bin/bash ps ux | sed -e '/bash/d' -e '/screen/d' | awk '' | while read process do  kill $process done 

Wenn es andere Prozesse gab, die Sie vermeiden wollten, müssen Sie lediglich weitere Prozesse hinzufügen

-e '/processname/d' 

Einträge in den sed Teil. Es gibt wahrscheinlich einen saubereren Weg, um damit umzugehen, aber das wird funktionieren.

1
pbr

Wenn Sie all Ihre Procs viel töten, möchten Sie vielleicht untersuchen, warum Sie das tun müssen ... aber hey, es geht nur darum, Dinge zu tun, und nicht, Dinge nicht zu tun.

Eine einfache Lösung wäre, zwei Benutzer-IDs zu verwenden ... eine für den Bildschirm und Ihre SSH-Verbindung und die andere für alle Prozesse, die Sie irgendwann beenden möchten.

Dies ist mehr als "hackerish" und einfach nur "hack", hat aber den zusätzlichen Vorteil, dass alle anderen Programme, die Sie als "connect" -Anwender ausführen, nicht getötet werden, wenn Sie die anderen Procs abtöten. Dies kann "Schwänze" von Fehlerprotokollen und Dingen beinhalten, die Sie vielleicht noch haben möchten.

Hoffe das hilft!

Sie meinen, zwei Benutzer-IDs für den Remote-Server zu haben? Nur neugierig, kann ich mir einen neuen erstellen, ohne zu root wechseln zu können? Tim vor 15 Jahren 0
1
Jack

Versuchen:

ps aux | grep ^$LOGNAME | egrep -v 'ps aux|-bash|sshd' | awk '{ print $2 }' | xargs kill -9; ps aux | grep $LOGNAME 
0
mkastner

Ich habe den Ansatz von @RoyRico verwendet - ich kann diesen Beitrag wegen mangelnder Reputation nicht kommentieren - und habe ihn an mein System angepasst. Aufgrund einer anderen Konfiguration funktionierte man nicht von der Stange.

ps -U myUserName | egrep -v "ssh|screen|grep|bash|systemd|(sd-pam)|ps" | awk '' | tail -n +2 | xargs -t kill 

Nun, ich habe mehr Prozesse ausgeschlossen, die ich nicht getötet haben wollte. Zweitens wurden die PIDs in der ersten Spalte angezeigt, sodass der vorherige Befehl zum Ausschneiden völlig falsch positioniert war (als hackerische Lösung etwas völlig normales und akzeptables;)). Drittens hatte ich beim Grep'ing eine "PID" als Überschrift, die ich durch die Verwendung von Tail ausschloss.