Wie gebe ich alle 2 Sekunden einen Netstat-Befehl in eine Textdatei aus?

Wie gebe ich alle 2 Sekunden einen Netstat-Befehl in eine Textdatei aus?

Ich versuche, Folgendes zu erreichen, aber es fällt mir schwer, es wie erwartet zum Laufen zu bringen. Habe versucht, den Befehl watch zu verwenden, aber die Ausgabe ist einfach nur ein Durcheinander. Ich habe Folgendes gefunden, konnte es aber nicht für meine Zwecke zum Laufen bringen:

watch 2 "netstat -a | grep 20427 | grep ESTABLISHED | wc -l"

Ich möchte den folgenden Befehl ausführen und alle zwei Sekunden eine Ausgabe in eine Datei mit den folgenden zwei Spalten erstellen.

netstat -a | grep 20427 | grep ESTABLISHED | wc- l

DATE_TIME | NUMBER_OF_CONNECTIONS
Fri Nov  6 14:57:37 | 5
Fri Nov  6 14:57:39 | 10
Fri Nov  6 14:57:41 | 5
Fri Nov  6 14:57:43 | 2

Vielen Dank für jede Hilfe, die Sie uns geben können. Passen Sie auf sich auf und bleiben Sie gesund.

Antwort1

watchist ein gutes Tool, wenn Sie … nun ja, beobachten möchten. Es interagiert mit dem Terminal. Wenn Sie seine Ausgabe in eine Datei umleiten, werden Sie irgendwann feststellen, dass Terminal-Steuersequenzen in die Datei geschrieben werden. Wenn Sie dies versucht haben, sind solche Sequenzen wahrscheinlich das von Ihnen erwähnte Durcheinander.

Eine einfache Möglichkeit, einen Befehl in einer Schleife auszuführen, besteht darin, … nun ja, eine Schleife zu verwenden. :)

Sie sagten, Sie wollten "alle 2 Sekunden" ausführen netstat | …. In einer Schleife haben Sie zwei Möglichkeiten:

  1. Sie führen die Pipeline asynchron aus, sleep2 Sekunden lang, und führen dann die neue aus, und so weiter. Auf diese Weise ist es fast perfekt „alle 2 Sekunden“. Wenn die Ausführung einer einzelnen Iteration jedoch länger als das Intervall dauert, kann die Ausgabe davon nach der Ausgabe der nächsten erscheinen oder sich sogar mit dieser vermischen.

  2. Sie führen die Pipeline synchron sleepfür 2 Sekunden aus und führen dann die neue aus; und so weiter. Auf diese Weise ist es nicht „alle 2 Sekunden“, sondern eher „2 Sekunden dazwischen“. Da jedoch zu einem bestimmten Zeitpunkt höchstens eine Pipeline ausgeführt wird, besteht kein Risiko, dass die Gesamtausgabe verstümmelt wird.

Note watch -n 2 'sleep 10; date'läuft dateetwa alle 10 Sekunden. Das watchselbst verwendet die Methode „2 Sekunden dazwischen“, nicht „alle 2 Sekunden“.

Eine Schleife, die whatevermit 2 Sekunden Pause läuft und die Ausgabe in eine Datei umleitet, kann sein:

while :; do whatever; sleep 2; done >output_file

In Ihrem Fall gibt es zwei weitere Probleme:

  1. Sie möchten einen Header. Platzieren Sie ihn zuerst in der Datei und hängen Sie dann ( >>) an die Datei an.

  2. Sie möchten, dass das Datum in derselben Zeile steht wie das Folgende. Die Ausgabe von date(auch bei einem benutzerdefinierten Format) endet mit einem Zeilenumbruchzeichen. Sie können es mit entfernen tr. Oder erfassen Sie die Ausgabe in einer Variablen (mit $()werden alle nachfolgenden Zeilenumbrüche entfernt) und drucken Sie sie später aus.

So was:

echo 'DATE_TIME | NUMBER_OF_CONNECTIONS' >output_file
while :; do
   date="$(date)"
   printf '%s | ' "$date"
   netstat -a | grep 20427 | grep ESTABLISHED | wc -l
   sleep 2
done >>output_file

verwandte Informationen