Einzeilige Ausgabe für Sudo Kill


1

Hintergrund

Ich habe einige Root-Prozesse, die ich zu beenden 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 '{print $2}'

Frage

Irgendwelche Ideen zur Erweiterung des Befehls (einzeilig), um eine Ausgabe wie die folgende in eine Protokolldatei umzuleiten?

  • Im Erfolgsfall:

    Erfolg! Abgebrochene Prozesse: pid1 pid2 ...

  • Im Falle eines Fehlers:

    Error! Eine Fehlermeldung.

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


Es gibt auch pkill, der nicht sicher ist, ob er protokolliert, der pgrep anstelle von ps | verwenden könnte grep | awk
Xen2050

In der Tat kann der Befehl mit pkill vereinfacht werden, aber ich bin daran interessiert, die Ausgabe / das Ergebnis zu erfassen.
Illyes Istvan

Antworten:


2

Wenn killall bei Ihnen nicht funktioniert und Sie die vollständige Befehlszeile abgleichen müssen, wird immer pgrep -f+ bash + protokolliert (auch technisch in einer Zeile ...)

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 anstatt wenn'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 anstelle aller T-Stücke alle stdout 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, ohne die Protokollierung, müssen Sie nur im Grunde pkill -foder sehr geringe Protokollierung von Erfolg / Misserfolg wie:

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

1

Verwenden Sie 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 zum Erliegen. Ich möchte nicht alle tcpdump-Prozesse beenden. So etwas wie: grep '[t] cpdump_someLabel.pcap'
Illyes Istvan

killall hat eine -r, --regexpoption, geht das nicht? @IllyesIstvan
Xen2050

@ Xen2050 -r interpretiert NAME als erweiterten regulären Ausdruck. Ich filtere basierend auf der Ausgabedatei, nicht dem Prozessnamen.
Illyes Istvan

@IllyesIstvan Ich dachte schon, deshalb antwortete ich basierend auf pgreps vollständiger Befehlszeilenübereinstimmung
Xen2050
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.