Speichern Sie die Ausgabe des Datums- und Überwachungsbefehls in einer Datei

23

Ich bin ein Linux-Neuling und versuche, einen Befehl zu überwachen und ihn in eine Datei einzuloggen. Ich habe es versucht

watch -t -n 10 "(Datum '+ ZEIT:% H:% M:% S'; ps aux | grep" pattern "| wc -l)" >> logfile

und erwarte ein Ergebnis wie

TIME: 10:32:30    12
TIME: 10:32:40    18
TIME: 10:32:50    2

im Logfile gespeichert werden. Wenn jedoch die Protokolldatei nicht druckbare Zeichen in hat. Wie erhalte ich diese Art der Ausgabe vom Befehl li

LoudKur
quelle

Antworten:

20

Um das zu tun, wonach Sie suchen, sollte ein einfaches Skript (wie @Ignacio hervorhob) den Trick ausführen:

while true
do
    echo "$(date '+TIME:%H:%M:%S') $(ps aux | grep "pattern" | wc -l)" | tee -a logfile
    sleep 2
done

Ich benutze teestattdessen, >>damit Sie die Ausgabe auf Ihrem Terminal sehen und in Ihrem Protokoll festhalten können.

Kirche
quelle
Ich scheine einen Fehler mit der 1 in der ersten Zeile zu bekommen. Aber als ich es in true geändert habe, hat es funktioniert. Die Ausgabe auf dem Bildschirm zeigt jedoch Zeit und Zählung in zwei verschiedenen Zeilen an, aber die Protokolldatei zeigt nur die Zählung an. Kann ich auf irgendeine Weise die Zeit abrufen und in derselben Zeile in der Protokolldatei zählen?
LoudKur
Ah richtig, denn der tee-Befehl läuft nur für ps. Ich werde meine Antwort ändern.
Kirk
Funktioniert perfekt! Vielen Dank. Gibt es eine Möglichkeit, den Zeitstempel zur Protokolldatei hinzuzufügen, damit er in eindeutigen Dateien gespeichert wird?
LoudKur
Du meinst zum Logdateinamen? Sie können so etwas wie eine Protokolldatei. $ (Datum +% Y% m% d) erstellen, um jeden Tag eine neue Protokolldatei zu erstellen.
Kirk
Ja, das habe ich getan. Fügen Sie den Code als Antwort auf diese Frage hinzu. Vielen Dank!
LoudKur
37

Dies kann watchauch ohne Verwendung von Skripten problemlos durchgeführt werden .

watch -t -n 10 "(date '+TIME:%H:%M:%S' ; ps aux | grep "pattern" | wc -l) | tee -a logfile"

Kasun Gajasinghe
quelle
1
Richtig. Ich schrieb, was ich auf einem Mac hatte, auf dem die Uhr nicht sofort verfügbar ist, und entschied mich für die tragbare Lösung. Dein ist viel einfacher.
Kirk
2
Mit anderen Worten, umfasst ein Rohr tee -a logfile innerhalb der arg übergeben watch. Sehr sauber, danke.
Wildcard
7

watchist für die Ausgabe auf einem Display gedacht. Wenn Sie einfach alle X Sekunden einen Befehl ausführen möchten, sollten Sie dafür einfach eine Verzögerungsschleife verwenden.

while true ; do somecommand ; sleep 2 ; done
Ignacio Vazquez-Abrams
quelle
5

watch ist ein ncurses-Programm und kann in einem Konsolenfenster (nicht umgeleitet) ausgeführt werden. Aus diesem Grund werden eine Reihe nicht druckbarer Zeichen erstellt (dies sind die Steuerzeichen, mit denen der Cursor verwaltet und verschoben wird, um den Bildschirm neu zu zeichnen).

Sie können versuchen, die date / grep-Befehle in ein Skript zu verschieben und dieses Skript dann von einem Cronjob aus aufzurufen.

Darth Android
quelle
3

Ok, also habe ich es in ein Skript geschrieben und habe den folgenden Code:

#!/bin/sh
NOW=$(date '+%Y%m%d%H%M%S')
LOGFILE="log.$NOW"

while true
do
    echo $(date '+[TIME: %H:%M:%S]   Output: ' ; ps aux | grep "pattern" | wc -l ) | tee -a $LOGFILE
    sleep 2
done
LoudKur
quelle
0

Ich bin auf diese Frage gestoßen, als ich versucht habe, eine bessere / protokollierte Ausgabe von zu erhalten du -sh $data_path. Ich habe das hier gefundene Muster "while command, do sleep" verwendet, aber ein komplexes AWK verwendet, um die gewünschte Ausgabe zu erhalten.

while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
    size=$1;
    path=$2;
    time=systime();
    seconds=time-prevtime;
    if(seconds < 1000000000){
        seconds=seconds" seconds"
    }else{
        seconds=""
    }
    print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds; 
    prevtime=time
}'

Ich habe das eigentlich als Oneliner gemacht, weshalb es Semikolons gibt. Aber um es lesbar zu machen, habe ich es ausgebrochen. Die Ausgabe sieht folgendermaßen aus:

502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds
Bruno Bronosky
quelle
0

Hier ist ein Beispiel, das ich gerade für eine watchOn-A- ps axfAusgabe mit einem Zeitstempel am unteren Rand der gesamten Ausgabe benötigt habe. Ich passe auf, wenn Apache ausfällt. Ich musste teefür jeden Befehl die Pipe an psund die date.

watch 'ps axf | grep --line-buffered "[a]pache2"| tee --append logfile-apache-issue.log; date '+TIME:%H:%M:%S' | tee --append logfile-apache-issue.log'

Beispielausgabe von tail --follow logfile-apache-issue.login der resultierenden Datei.

29862 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29863 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29864 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29865 ?        S      0:00          \_ /usr/sbin/apache2 -k start
26635 pts/2    S+     0:00  |       \_ tail -n 1000 -f /var/log/apache2/error.log
TIME:02:21:13
13622 ?        SN     0:33      \_ /usr/sbin/apache2 -k start
25038 ?        Ss     0:01      \_ /usr/sbin/apache2 -k start
29859 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29860 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29861 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29862 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29863 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29864 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29865 ?        S      0:00          \_ /usr/sbin/apache2 -k start
26635 pts/2    S+     0:00  |       \_ tail -n 1000 -f /var/log/apache2/error.log
TIME:02:21:15
13622 ?        SN     0:33      \_ /usr/sbin/apache2 -k start
25038 ?        Ss     0:01      \_ /usr/sbin/apache2 -k start
29859 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29860 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29861 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29862 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29863 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29864 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29865 ?        S      0:00          \_ /usr/sbin/apache2 -k start
26635 pts/2    S+     0:00  |       \_ tail -n 1000 -f /var/log/apache2/error.log
TIME:02:21:16
Elijah Lynn
quelle