Einführung
FRAME Studio überprüft die Linux-Arbeitsstation für den Fotoexport einer Veranstaltung. Vor einer längeren Beobachtung benötigt das Studio verlässliche Messwerte: nicht inaktive CPU-Zeit, nicht unmittelbar verfügbaren Speicher und die Belegung des Dateisystems mit dem Exportverzeichnis. Ein hoher Wert muss interpretiert werden; er beweist keinen fehlgeschlagenen Auftrag.
Du implementierst drei kurze Bash-Funktionen und verwendest einen vorbereiteten Adapter, der echte Linux-Befehle ausführt. Vorausgesetzt werden Terminalpfade sowie Bash-Variablen, Funktionen, Bedingungen und Schleifen, wie in Shell for Beginners vermittelt. Die vorbereiteten Programme verbinden die Befehle; du liest diese Verbindung und implementierst die Prozentrechnung. Diese unabhängige Linux-Instanz enthält zwei kleine echte ext4-Dateisysteme. Deren Vorbereitung und Einhängen gehören nicht zu deinen Aufgaben. Die Zeitangabe ist eine Schätzung des Autors einschließlich Lesen und üblicher Fehler.
Miss die nicht inaktive CPU-Zeit
In diesem Schritt betrachtest du eine funktionierende Ressourcenmomentaufnahme und implementierst die CPU-Umrechnung.
Beginne in Terminal. Alle Befehle dieses Labs werden hier ausgeführt. Öffne den vorbereiteten Arbeitsbereich; pwd zeigt den Standort, ls die Dateien. Falls später eine relative Datei fehlt, verwende erneut diesen vollständigen cd-Befehl, statt die Instanz zurückzusetzen.
Befehle eingeben
Klicke vor dem Tippen in Terminal. Kopiere nur den Inhalt eines Befehlsblocks, nicht den Prompt, die umgebenden Backticks oder eine erwartete Ausgabe. Drücke nach jedem Befehl Enter und warte auf die Rückkehr des Prompts. Ein Befehl kann erfolgreich enden, ohne etwas auszugeben. Lass während des gesamten Labs dasselbe Terminal geöffnet.
cd /home/labex/project/resource-watch
pwd
Der Pfad sollte auf /resource-watch enden. Starte die vorbereitete Demonstration mit Bash:
bash demo.sh
Die erste Zeile benennt vier Felder. Die nächste enthält einen UTC-Zeitstempel und drei echte Prozentwerte. Die Werte schwanken. demo.sh ist ein mitgeliefertes funktionierendes Beispiel; es vervollständigt weder deine Funktionen noch speichert es deine Antwort.
UTC timestamp | CPU non-idle % | memory pressure % | target filesystem used %
2026-...Z ... ... ...
CPU-Prozente beschreiben die Zeit der virtuellen CPUs dieser Instanz. vmstat meldet Systemaktivität. Bei vmstat 1 2 bezeichnet 1 das Intervall in Sekunden und 2 die Anzahl der Berichte. Der erste CPU-Bericht ist ein Durchschnitt seit dem Start; der zweite betrifft das neue Intervall. Führe den Befehl aus, bevor du Felder extrahierst:
LC_ALL=C vmstat 1 2
LC_ALL=C gibt diesem Befehl ein stabiles englisches Zahlenformat. Suche in den CPU-Spalten nach id: Das ist die inaktive Zeit. Dieser Kurs definiert nicht inaktiv = 100 - inaktiv. Darin enthalten sind E/A-Wartezeit und gestohlene Zeit; der Wert entspricht weder allein deiner Programmausführung noch einer Fehlerdiagnose.
Der Adapter verwendet eine Pipeline: | leitet die Ausgabe eines Befehls an den nächsten weiter. tail -n 1 wählt die letzte Zeile. awk '{print $15}' gibt deren fünfzehntes, durch Leerraum getrenntes Feld aus, die Spalte id dieser vorbereiteten procps-Version. Die einfachen Anführungszeichen halten $15 für awk zurück, statt es durch die Shell expandieren zu lassen. Prüfe, dass der extrahierte Wert ganzzahlig ist:
LC_ALL=C vmstat 1 2 | tail -n 1 | awk '{print $15}'
Bearbeite nun die vorbereiteten Funktionen. nano ist ein Terminaleditor. Öffne die Datei und ersetze nur das : innerhalb von cpu_nonidle; lasse die anderen Funktionen unverändert. Der Doppelpunkt ist ein Platzhalter ohne Wirkung.
nano metrics.sh
Bewege den Cursor mit den Pfeiltasten. Lösche in der ersten Funktion nur die Doppelpunktzeile und füge die beiden unten gezeigten eingerückten Zeilen ein. Behalte Funktionsnamen, öffnende und schließende Klammern und andere Funktionen bei. Das vollständige Beispiel zeigt das Ziel; füge keine zweite Kopie unter das Original ein. Einrückung erleichtert das Lesen; Klammern und Schreibweise müssen stimmen.
Die erste Funktion soll so aussehen:
cpu_nonidle() {
local idle=$1
echo $((100 - idle))
}
$1 ist das erste Funktionsargument. local begrenzt die Variable auf die Funktion. $((...)) führt Ganzzahlarithmetik aus, echo gibt das Ergebnis aus. Speichere und beende mit Ctrl+O, Enter, Ctrl+X. Falls eine spätere Änderung einen Syntaxfehler erzeugt, öffne die Datei erneut und korrigiere die betreffende Funktion; der vorbereitete Sampler bleibt intakt.

Hier ist nur die erste Funktion vollständig; die beiden anderen Doppelpunkt-Platzhalter sind beabsichtigt. Unten in nano steht das Zirkumflexzeichen für Ctrl. ^O bedeutet beispielsweise Ctrl halten und O drücken, nicht diese zwei Zeichen tippen.

Nach Ctrl+O fragt nano unten nach dem Dateinamen. Lass den vorhandenen Namen unverändert und bestätige mit Enter; Ctrl+X bringt dich danach zum Shell-Prompt zurück. Bei einer falsch geöffneten Datei drücke Ctrl+X und antworte auf die Speicherfrage mit N; öffne dann die richtige Datei. Gib keine Shell-Befehle ein, solange der Editor geöffnet ist.
source lädt Definitionen in die aktuelle Shell. Terminal startet Zsh, diese Übung verwendet aber Bash: Mit bash -c führst du den zitierten Test in Bash aus. Die äußeren einfachen Anführungszeichen bewahren den inneren Befehl.
bash -c 'source ./metrics.sh; cpu_nonidle 97'
3
Dieser vorgegebene Inaktivitätswert prüft die Rechnung; er behauptet nicht, der aktuelle Prozentwert sei genau 3%. Prüfe auch beide Endpunkte:
bash -c 'source ./metrics.sh; cpu_nonidle 0; cpu_nonidle 100'
100
0
Deine Funktion funktioniert für jeden ganzzahligen Inaktivitätswert von 0 bis 100. Der echte Sampler liefert den frisch gemessenen Wert.
Unterscheide verfügbaren und freien Speicher
In diesem Schritt berechnest du den Speicherdruck anhand des Speichers, den Linux für neue Anwendungen als verfügbar einschätzt.
Bleibe in Terminal, in /home/labex/project/resource-watch. free -k zeigt Speicher in KiB, Einheiten von 1024 Byte. Führe den Befehl vor der Auswertung aus:
LC_ALL=C free -k
Lies die Zeile Mem:. free ist völlig ungenutzter Speicher; available schätzt den ohne Auslagerung für neue Anwendungen nutzbaren Speicher einschließlich eines Teils des rückgewinnbaren Caches. Betrachte nicht den gesamten Cache als dauerhaft unzugänglich. Der Kurs verwendet floor((total - available) * 100 / total) als Druck-Prozentwert. Er sagt nicht voraus, ob eine bestimmte zukünftige Zuweisung gelingt.
Der Adapter wählt Gesamt- und verfügbaren Speicher aus derselben Zeile. In awk passt /^Mem:/ auf eine mit Mem: beginnende Zeile; $2 und $7 wählen das zweite und siebte Feld.
LC_ALL=C free -k | awk '/^Mem:/ {print $2, $7}'
Die Ausgabe enthält zuerst Gesamt-, dann verfügbaren Speicher. Beide haben dieselbe Einheit, sodass das Verhältnis sinnvoll ist. Beispielsweise ergeben insgesamt 1000 und verfügbar 750 einen Wert von 25%, nicht 75%.
Öffne die Datei und ersetze nur den Platzhalter von memory_pressure:
nano metrics.sh
memory_pressure() {
local total=$1 available=$2
echo $(((total - available) * 100 / total))
}
Die Ganzzahldivision von Bash verwirft den Bruchteil. Bei nicht negativen Eingaben und positiver Gesamtmenge entspricht dies dem Abrunden. Multipliziere vor dem Dividieren, damit der Bruchteil nicht vorzeitig verloren geht. Speichere mit Ctrl+O, Enter, Ctrl+X.
bash -c 'source ./metrics.sh; memory_pressure 1000 750; memory_pressure 3 2'
25
33
Das Ergebnis 33 ist beabsichtigt, wenn eine von drei Einheiten nicht verfügbar ist. Der Vertrag verwendet gleich große ganzzahlige Einheiten und einen verfügbaren Wert zwischen null und Gesamtmenge. Ungültige Eingaben werden außerhalb dieser kleinen Übung behandelt.
Im ersten Test sind 1000 - 750 = 250 Einheiten nicht verfügbar, also 250 × 100 ÷ 1000 = 25. Im zweiten ist eine von drei Einheiten nicht verfügbar: 33.333… wird zu 33, weil die Funktion eine Ganzzahl zurückgibt. Das zweite Argument ist die verfügbare Menge, kein bereits berechneter Prozentwert. Bewahre die CPU-Funktion aus dem vorigen Schritt.
Erfasse das richtige Dateisystem
In diesem Schritt vervollständigst du die Dateisystemfunktion und speicherst eine vollständige Beobachtung.
Bleibe in Terminal, in /home/labex/project/resource-watch. Die Verzeichnisse exports und reference liegen auf unterschiedlichen vorbereiteten ext4-Dateisystemen. Bewahre jeweils Originalmaterial und Notizen. Du beobachtest nur Platz: Lösche kein Material, ändere keine Mounts und versuche nicht, Dateisysteme zu füllen.
df meldet das Dateisystem, das den angegebenen Pfad enthält. Die Option -P liefert ein vorhersehbares Format mit einer Zeile je Dateisystem. Vergleiche die Pfade:
df -P exports reference
Lies Capacity, nicht die Dateianzahl eines Verzeichnisses. Die Belegung von exports sollte niedriger sein als die von reference. df / würde ein anderes Dateisystem beschreiben und ersetzt das ausgewählte Ziel nicht.
Ersetze in nano nur filesystem_used:
nano metrics.sh
filesystem_used() {
df -P "$1" | awk 'NR == 2 {gsub(/%/, "", $5); print $5}'
}
Doppelte Anführungszeichen erhalten den Pfad als einzelnes Argument. NR == 2 wählt die Zeile nach der Kopfzeile. gsub entfernt % aus dem fünften Feld vor der Ausgabe. Speichere mit Ctrl+O, Enter, Ctrl+X. Eine andere Implementierung ist ebenfalls zulässig, wenn sie dieselbe Ganzzahl für das angefragte Dateisystem liefert.
bash -c 'source ./metrics.sh; filesystem_used exports; filesystem_used reference'
Die zwei Zahlen müssen ihren jeweiligen df-Zeilen entsprechen. Führe abschließend das vorbereitete Programm aus:
bash snapshot.sh
Es gibt jetzt UTC-Zeitstempel, nicht inaktive CPU, Speicherdruck und Zielbelegung mit Tabulatoren getrennt aus. CPU und Speicher können zwischen Befehlen schwanken. Lies den Adapter, um die Einzelbeobachtungen zu verbinden:
cat capture.sh
Der Adapter führt vmstat und free aus, ruft deine Funktionen auf und liest das Ziel mit df. $(...) übernimmt die Ausgabe; read -r weist die durch Leerraum getrennten Felder zu, und <<< übergibt den übernommenen Text an diesen Lesevorgang. Diese Verbindung ist vorbereitet; deine Funktionen bestimmen die Prozentwerte.
Speichere eine echte Momentaufnahme. > leitet die Ausgabe um und ersetzt diese einzelne Datei, ohne den ursprünglichen Bedienerverlauf zu ändern.
Die Endung .tsv bedeutet tabulatorgetrennte Werte: eine Beobachtung pro Zeile, ein Tabulator zwischen Feldern. Die Momentaufnahme hat vier Felder in dieser Reihenfolge: UTC-Zeitstempel, nicht inaktiver CPU-Prozentwert, Speicherdruck-Prozentwert und Belegungsprozentsatz des Zieldateisystems. UTC ist ein gemeinsamer Zeitstandard; das abschließende Z kennzeichnet UTC. Diese Prozente beschreiben verschiedene Ressourcen: Addiere sie nicht und erwarte keine Summe von 100.
bash snapshot.sh > snapshot.tsv
cat snapshot.tsv
Falls du einen Datei- oder Funktionsnamen falsch schreibst, verwende ls, öffne metrics.sh erneut, korrigiere den Fehler und wiederhole den Momentaufnahmebefehl. Ersetze keine fehlgeschlagene Beobachtung durch erfundene Zahlen. Du hast jetzt einen Bash-Sampler mit ausdrücklichen Berechnungen und Zielen.
Zusammenfassung
Du hast nicht inaktive CPU-Zeit über ein neues Intervall gemessen, Druck aus verfügbarem Speicher berechnet und das Dateisystem des tatsächlichen Ziels ausgewählt. Deine drei Bash-Funktionen erzeugen eine echte Momentaufnahme. Das nächste unabhängige Lab stellt diese Funktionen bereit und ergänzt Warnregeln und einen erhaltenen Verlauf.



