Integration von "watch" mit "top" -Logging bis zum Abschluss - WIE?

533
mshaffer

Ich bin über diesen Link gestolpert: "Watch" die Ausgabe eines Befehls, bis eine bestimmte Zeichenfolge beobachtet wird, und dann beenden

Ich kenne die PID des Prozesses. Ich möchte den Prozess "Ressourcenverbrauch" mit top protokollieren.

Grundsätzlich top -p PID -b >> LOGFILE.

Ich möchte, dass dieser Schritt in Schritten ausgeführt wird, beispielsweise alle 5 Sekunden mit dem Befehl "watch"

watch -n 5 

Aus einem unabhängigen / externen Programm werde ich "We Are Finished" an die Logdatei anhängen.

Ich möchte, dass die Protokollierung von watch / top unterbricht / beendet wird, wenn "Wir sind fertig" sind. Daher grepsollte die gesamte Protokolldatei ausgewertet werden, nicht nur der aktuelle Wert.

Ich möchte, dass der Befehl in einer nicht blockierenden Form ausgeführt wird ... endet möglicherweise mit " &"

Ich setze -d auf 5, damit top und Uhr gleichzeitig erstellt wird? ...

Hier ist mein Versuch, die Option "-e" zu verwenden, die vom Link oben vorgeschlagen wird und nicht wie erwartet funktioniert ... PID und LOGFILE sind geeignete Werte.

watch -n 5 -e "! top -d 5 -b -p PID >> LOGFILE | grep -m 1 \"We Are Finished\"" & 
0
Wenn Sie die Standardausgabe an "LOGFILE" anhängen, wird nichts an "grep" weitergeleitet. Sie müssen durch "tee -a LOGFILE" pfeifen, um die Ausgabe an beide Stellen zu leiten, oder (komplexer), wenn "grep" die Eingabe von "LOGFILE" übernimmt, nachdem es geschrieben wurde. AFH vor 7 Jahren 0
@afh danke für die ideen ... kannst du die tee-syntax angeben? Ich brauche nicht "komplexer", da "We are Finished" nicht von dieser Uhrenschleife geschrieben wird. mshaffer vor 7 Jahren 0
watch -n 5 -e "! top -d 5 -b -p PID >> LOGFILE | grep -m 1 \" Wir sind fertig \ "LOGFILE" & mshaffer vor 7 Jahren 0
Ich verstehe Ihre Kommentare nicht: Sie haben Ihren ursprünglichen Befehl gerade mit einem falschen zusätzlichen Anführungszeichen wiederholt. Ich habe Ihnen die Syntax in meinem Kommentar oben gegeben: Ersetzen Sie `>> LOGFILE` durch` | tee -a LOGFILE`, aber wenn "" Wir sind fertig "" nicht geschrieben werden, warum suchen Sie danach? AFH vor 7 Jahren 0
@AFH "Wir sind fertig" wird von einem externen Programm geschrieben ... Das externe Programm führt diese "Protokollierungsfunktion" aus .... und die Protokollierungsfunktion stoppt sich selbst bei "Wir sind fertig". mshaffer vor 7 Jahren 0
Deshalb habe ich zweimal "LOGFILE" hinzugefügt. einmal auf der grep-seite ... mshaffer vor 7 Jahren 0
Entschuldigung, ich habe es am Ende nicht bemerkt. Sie sollten `&&` anstelle von `|` vor `grep` verwenden. Der Grund, warum ich gesagt habe, dass dies komplexer ist, ist, dass sich "We are Finished" vor dem Ausführen des Befehls in "LOGFILE" befinden kann, wohingegen "tee" die Zeichenfolge nur bei jeder Ausführung des Befehls erkennt. AFH vor 7 Jahren 1

1 Antwort auf die Frage

0
MShaffer
until grep -qm 1 '\"We Are Finished\"' LOGFILE; do top -d 5 -n 12 -b -p PID >> LOGFILE; done 

Wenn Sie die Protokollierung für einen Prozess beenden möchten, wenn die PID nicht mehr ausgeführt wird, sollte das folgende Skript funktionieren? (Dadurch werden zwei Prozesse vermieden, die in dieselbe Datei schreiben?)

Es werden drei Parameter benötigt: die PID, die Position von LOGFILE und die TIME zwischen Protokolleinträgen.


#!/bin/bash  if [ $# -lt 3 ] then echo "Usage logpid (PID) (LOGFILE) (Time between in sec)" exit 1; fi  while : do  if ps -p $1 > /dev/null ; then top -n 1 -b -p $1 >> $2; else echo "Exited No pid"; break; fi sleep $3;  done