Dies ist watch
auch ohne Skripts möglich.
watch -t -n 10 "(date '+TIME:%H:%M:%S' ; ps aux | grep "pattern" | wc -l) | tee -a logfile"
Ich bin ein Neuling in Linux und versuche, einen Befehl zu überwachen und ihn in eine Datei einzuloggen. Ich habe es versucht
watch -t -n 10 "(Datum '+ TIME:% H:% M:% S'; ps aux | grep" Muster "| wc -l)" >> Protokolldatei
und erwarte ein ergebnis wie
TIME: 10:32:30 12 TIME: 10:32:40 18 TIME: 10:32:50 2
im Logfile gespeichert werden. Allerdings, wenn die Protokolldatei nicht druckbare Zeichen enthält. Wie erhalte ich diese Art von Ausgabe vom Befehl li
Dies ist watch
auch ohne Skripts möglich.
watch -t -n 10 "(date '+TIME:%H:%M:%S' ; ps aux | grep "pattern" | wc -l) | tee -a logfile"
Um das zu tun, wonach Sie suchen, sollte ein einfaches Skript (wie @Ignacio darauf hinweist) 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 tee
stattdessen, >>
damit Sie die Ausgabe auf Ihrem Terminal sehen und in Ihrem Protokoll erfassen können.
watch
ist für die Ausgabe auf einem Display gedacht. Wenn Sie einfach alle X Sekunden einen Befehl ausführen möchten, sollten Sie dafür eine Verzögerungsschleife verwenden.
while true ; do somecommand ; sleep 2 ; done
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 zum Neuzeichnen des Bildschirms bewegt wird).
Sie könnten versuchen, die date / grep-Befehle in ein Skript zu verschieben und dann dieses Skript von einem Cronjob aus aufzurufen.
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
Ich bin auf diese Frage gestoßen, als ich versuchte, bessere / protokollierte Ausgaben zu erhalten du -sh $data_path
. Ich habe das Muster "while-Befehl, schlafen" verwendet, das ich hier gefunden habe, aber etwas 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