Einzeiliger Capture-Output für Sudo-Kill

447
Illyes Istvan

Hintergrund

Ich habe einige Wurzelprozesse, die ich zu töten versuche, genauer gesagt einige tcpdumpProzesse. Daher muss ich verwenden sudo kill.

Mein aktueller Befehl sieht ungefähr so ​​aus:

sudo kill $(ps aux | grep '[t]cpdump' | awk '' 

Frage

Irgendwelche Ideen für die Erweiterung des Befehls (es bleibt ein Einzeiler), damit eine Ausgabe wie unten in eine Protokolldatei umgeleitet wird?

  • Im Erfolgsfall:

    Erfolg! Getötete Prozesse: pid1 pid2 ...

  • Im Fehlerfall:

    Error! Einige Fehlermeldung

Eine einfache Umleitung reicht nicht aus, da der Kill-Befehl nicht die Prozesse ausgibt, die er beendet hat.

0
Es gibt auch pkill, der nicht sicher ist, ob es sich um das Logging handelt, es könnte jedoch pgrep anstelle von ps | grep | awk Xen2050 vor 5 Jahren 0
Tatsächlich kann der Befehl mit pkill vereinfacht werden, aber ich bin daran interessiert, die Ausgabe / das Ergebnis zu erfassen. Illyes Istvan vor 5 Jahren 0

2 Antworten auf die Frage

1
RalfFriedl

Verwenden killall.

killall -v tcpdump 

Wenn Sie weitere Diagnosen wünschen, überprüfen Sie den Rückkehrcode von killall.

Ich greife tatsächlich nach einer bestimmten tcpdump-Ausgabedatei und bringe den entsprechenden Prozess ab. Ich möchte nicht alle tcpdump-Prozesse beenden. So etwas wie: grep '[t] cpdump_someLabel.pcap' Illyes Istvan vor 5 Jahren 0
killall hat die Option -r, --regexp, funktioniert das nicht? @IllyesIstvan Xen2050 vor 5 Jahren 0
@ Xen2050 -r interpretiert NAME als erweiterten regulären Ausdruck. Ich filte nach Ausgabedatei, nicht nach dem Prozessnamen. Illyes Istvan vor 5 Jahren 0
@IllyesIstvan Ich dachte mir, deshalb antwortete ich, basierend auf pgrep 'vollständiger Befehlszeile Xen2050 vor 5 Jahren 0
1
Xen2050

Wenn killall für Sie nicht funktioniert und Sie die vollständige Befehlszeile anpassen müssen, gibt es immer pgrep -f+ bash + logging (sogar technisch in einer Zeile gehalten ...)

Zuerst ein paar Zeilen

if tempkill1=$(pgrep -f "your_pattern") then if kill $tempkill1  then echo Success killed $tempkill1 | tee -a logfile  else echo Error could not kill $tempkill1 | tee -a logfile fi else echo No processes found | tee -a logfile fi 

oder anstelle von if's

tempkill1=$(pgrep -f "your_pattern") && { kill $tempkill1 && echo Success \ killed $tempkill1 | tee -a logfile || echo Error could not kill \ $tempkill1 | tee -a logfile; } || echo No processes found | tee -a logfile 

Oder leiten Sie statt aller Abschläge alle Standardausgänge um:

exec > >(tee -a logfile); tempkill1=$(pgrep -f "your_pattern") && { kill $tempkill1 \ && echo Success killed $tempkill1 || echo Error could not kill $tempkill1; } || \ echo No processes found; exec > /dev/tty 

Natürlich benötigen Sie ohne die Protokollierung im Wesentlichen nur eine pkill -fsehr geringe Protokollierung des Erfolgs / Misserfolgs wie:

pkill -f "your_pattern" && echo Success|tee -a log || echo Error|tee -a log