
Ich bin über diesen Link gestolpert:„Beobachten“ Sie die Ausgabe eines Befehls, bis eine bestimmte Zeichenfolge angezeigt wird, und beenden Sie dann
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 dies schrittweise ausgeführt wird, beispielsweise alle 5 Sekunden mit dem Befehl „watch“
watch -n 5
Von einem unabhängigen/externen Programm aus werde ich „We Are Finished“ an die Protokolldatei anhängen.
Ich möchte, dass die Protokollierung von Watch/Top unterbrochen/beendet wird, wenn „Wir sind fertig“. Daher grep
sollte 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 habe -d auf 5 gesetzt, damit Top und Watch gleichzeitig erstellt werden? …
Hier ist mein Versuch mit der im obigen Link vorgeschlagenen Option „-e“, der 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\"" &
Antwort1
until grep -qm 1 '\"We Are Finished\"' LOGFILE; do top -d 5 -n 12 -b -p PID >> LOGFILE; done
Wenn Sie die Protokollierung eines Prozesses beenden möchten, wenn die PID nicht mehr ausgeführt wird, sollte das folgende Skript funktionieren? (Verhindert dies, dass zwei Prozesse in dieselbe Datei schreiben?)
Es werden drei Parameter benötigt: die PID, der Speicherort der Protokolldatei und die ZEIT zwischen den 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