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.

Illyes Istvan
quelle
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
Xen2050
quelle
1

Verwenden Sie killall.

killall -v tcpdump

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

RalfFriedl
quelle
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