Ich erstelle ein Skript mit usr/bin/time
einem Programm zur Überwachung der RAM-Nutzung eines Skripts und speichere es in einer Variablen, sodass ich überprüfen kann, ob es über einem angegebenen Grenzwert liegt $mlimit
, wie in diesem Beispiel mit ls /
dem folgenden Befehl:
$mlimit=512000 #512mb limit in kilobytes
$musage=$(/usr/bin/time -f "%M" ls / | rev | cut -f 1 | rev)
echo "RAM usage: $musage"
/usr/bin/time
in diesem Fall gibt zuerst die Ausgabe des Befehls und dann die maximale Größe des Resident Sets (RAM-Nutzung) zurück. Ich dachte, ich könnte dann die Ausgabe umkehren, sie kürzen, um die RAM-Nutzung zu erhalten, und sie dann wieder umkehren. Aber ich erhalte diese Ausgabe: RAM usage: bin
. bin
ist das erste Verzeichnis, das vom ls /
Befehl zurückgegeben wird. Meine Strategie, die RAM-Nutzung zu erhalten, funktioniert also nicht.
Danke
Antwort1
GNU time
gibt die Informationen zur Ressourcennutzung auf stderr aus, kann aber angewiesen werden, sie woanders auszugeben mit-o
{
musage=$(command time -o /dev/fd/4 -f %M ls / 4>&1 >&3 3>&-)
} 3>&1
Würde die maximale Speichernutzung in der Variablen aufzeichnen und dabei ls
„stdout“ und „stderr“ unverändert lassen.
Dies funktioniert, indem außerhalb der Befehlsersetzung mit das ursprüngliche fd 1 (stdout) auf fd 3 dupliziert wird 3>&1
, sodass wir innerhalb der Befehlsersetzung das ursprüngliche stdout für ls
mit wiederherstellen können >&3
, nachdem wir die Befehlsersetzungs-Pipe auf fd 4 verfügbar gemacht haben.
Schreibt dann time
seine Ausgabe über in diese Pipe /dev/fd/4
, während ls
stdout das Original ist.