Linux Sonntags-Optionen – Kleine unbekannte Schätze der CLI

Linux Sonntags-Optionen – Kleine unbekannte Schätze der CLI
Diese Seite sammelt wöchentlich kleine, oft übersehene Optionen von klassischen Linux-Kommandos. Viele Tools nutzt jeder – aber manchmal verstecken sich gerade in den selten genutzten Optionen die spannendsten Details.
1: free -hl – Low/High Memory sichtbar machen
`free -h` kennt praktisch jeder. Aber mit der Option `-l` zeigt `free` zusätzlich die Aufteilung zwischen *Low-Memory* und
- High-Memory*. Das ist besonders bei Systemen mit viel RAM
interessant, da die Kernel-Sicht manchmal überrascht. ]
Beispiel
$ free -hl
gesamt benutzt frei gemns. Puffer/Cache verfügbar
Speicher: 38Gi 12Gi 4,3Gi 4,5Gi 26Gi 25Gi
Niedrig: 38Gi 34Gi 4,3Gi
Hoch: 0B 0B 0B
Swap: 5,0Gi 1,7Mi 5,0Gi
Alias
Für eine kurze, gut lesbare Ausgabe:
alias FREE-HL='free -hl'
Aus der Praxis: Swap sichtbar leeren
Mit 'free -hl' kann man die aktuelle Situation gut einschätzen. Wenn man allerdings eigentlich ausreichend RAM hat, der Swapspace aber dennoch gut gefüllt ist,
kann man auf die Idee kommen mit swapoff -a den swap abzuschalten und dann wieder zu aktivieren.
(nicht auf produktiven Systemen unter Last Rootserver / Testsystem / bewusst gemacht. dauert → Minuten, kein „mal eben“)
Ein Tipp aus der Praxis:
Setup
Terminal 1: swapoff -a
Terminal 2: free -hls 5 # (das zeigt den Status alle 5 Sekunden)
Wieder den swap aktivieren mit 'swapon -a'
Erläuterung
Schritt für Schritt am konkreten Beispiel
gesamt benutzt frei gemns. Puffer/Cache verfügbar Speicher: 7,6Gi 1,7Gi 4,5Gi 127Mi 1,8Gi 5,9Gi Niedrig: 7,6Gi 3,1Gi 4,5Gi Hoch: 0B 0B 0B
1️⃣ Warum „Niedrig = gesamt 7,6 Gi“?
Auf 64-Bit-Systemen (dein Fall) ist es heute normal, dass:
der gesamte RAM als „Low Memory“ gilt
„High Memory“ praktisch nicht mehr benutzt wird
Darum:
Niedrig gesamt = kompletter RAM Hoch = 0
2️⃣ Was bedeutet „Niedrig / benutzt = 3,1 Gi“?
Das ist der Teil des RAMs, der:
im Low-Memory-Bereich liegt und aktuell nicht frei ist
Dazu gehören u.a.: Kernel-Code & -Daten Treiber Slab-Allocator (Caches für Kernelobjekte) Page Tables DMA-fähige Speicherbereiche
Teile von Buffern/Caches, die im Lowmem liegen
👉 Das ist völlig normal.
3️⃣ Warum widerspricht das nicht den 1,7 Gi „Speicher benutzt“ oben?
Weil das verschiedene Sichten sind:
„Speicher / benutzt“ (1,7 Gi) → User-Space-Sicht (Prozesse, die du „siehst“)
„Niedrig / benutzt“ (3,1 Gi) → Kernel-Sicht (inkl. interner Kernelstrukturen)
Der Kernel „versteckt“ RAM nicht, er benutzt ihn einfach für Dinge, die nicht als Prozesse auftauchen.
4️⃣ Warum ist das kein Problem?
Der wichtigste Wert steht ganz rechts:
verfügbar: 5,9Gi
👉 Das ist der entscheidende Wert.
Er sagt:
So viel RAM kann sofort für neue Programme genutzt werden, ohne dass das System ins Schwitzen kommt.
Solange „verfügbar“ hoch ist und Swap leer, ist alles bestens. „‚benutzt‘ ist keine Warnung – ‚verfügbar‘ ist die Wahrheit.“
Warum ist free -hl nützlich?
- zeigt zusätzliche Kernel-Perspektive
- erklärt scheinbare „phantomhafte RAM-Belegung“
- hilft beim Debuggen von Speicherengpässen
- ideal für jede Analyse jenseits von „free -h“
dd mit eingebautem Fortschritt
Es gibt halt kleine Tools, die einem in Fleisch und Blut übergegangen sind.
dd ist so ein Tool, klar, kennt jeder, der schon ein wenig mit Linux unterwegs ist. Häufig wird es benutzt, um Abbilder auf USB Sticks zu kopieren, blöd ist nur, dass man keinen Fortschritt sieht, man muss sich halt gedulden.
So sieht das ungefähr aus.
dd if=Superlinux.iso of=/dev/sdc bs=8M
Doch es lohnt sich alle paar Versionen mal wieder die Man Pages zu studieren, denn seit der Version 8.24 hat dd den Parameter status um progress erweitert.
Nun ist es bequem möglich, den Fortschritt zu beobachten, mit dem oflag=direct wird die Schreiboperation auch nicht gebuffert, (je nach Gerät/Filesystem nicht immer sinnvoll) d.h. Wenn dd sagt, es ist fertig, kann man den Stick entnehmen und muss nicht erst auf das Ende der Schreiboperation warten.
Direkt mit Fortschritt starten
dd if=/dev/sdX of=/mnt/backup/disk.img bs=16M status=progress conv=fsync
status=progress zeigt laufend Bytes + Durchsatz (geht auf stderr).
bs=16M macht’s meist deutlich schneller als Default.
Optional, damit er am Ende noch hübsch zusammenfasst:
conv=fsync sorgt dafür, dass am Ende wirklich alles raus geschrieben ist (langsamer, aber „ehrlicher“ beim Fertig werden).
Nachträglich Fortschritt anzeigen, obwohl ohne status=progress gestartet
Das ist der eigentliche Nerd-Goldklumpen:
1️⃣ PID finden
pidof dd
oder:
pgrep -x dd
2️⃣ Status anfordern (ohne Abbruch)
kill -USR1 <PID>
Dann schreibt dd sofort eine Statuszeile nach stderr (z.B. „bytes kopiert, Sekunden, MB/s“).
So, wars das?
Ich finde, da geht noch was...
Alternative
wenn pv verfügbar (also apt install pv ) ist, hat man eine bessere Ausgabe und auch eine 'Abschätzung der Laufzeit' des Vorgangs.
[==========> ] 58% ETA 0:00:10
Achtung: Die Syntax ist etwas anders, weil dd durch die Pipe gefüttert wird, fällt if= weg! Die Fütterung übernimmt pv ,welches den Data Stream per STDin in die Pipe sendet.
pv linux_isos/MX-23.4_x64.iso| dd of=test.iso bs=16M
2,13GiB 0:00:59 [36,9MiB/s] [========================================================================================>] 100%
0+34880 Datensätze ein
0+34880 Datensätze aus
2285895680 Byte (2,3 GB, 2,1 GiB) kopiert, 58,8298 s, 38,9 MB/s
und nein, hier braucht man wirklich nur das nackte pv nutzen, die üblichen Optionen sind bereits gesetzt. Aber ein conv=fsync fürs dd kann man noch dran hängen.
Vorteile von pv:
- ETA-Anzeige
- übersichtliche Progressbar
- unabhängig von dd-Version
Zu pv sagt die man-page:
Zeigt den Fortschritt der Daten durch eine Pipeline an, indem Informationen wie die verstrichene Zeit, der Prozentsatz der abgeschlossenen Datenübertragung (mit Fortschrittsbalken), die aktuelle Durchsatzrate, die insgesamt übertragene Datenmenge und die voraussichtliche Ankunftszeit (ETA) angezeigt werden.
Jede DATEI wird in die Standardausgabe kopiert. Ohne DATEI oder wenn DATEI „-“ ist, wird die Standardeingabe gelesen. Dies entspricht dem Verhalten von cat(1).
Lokale IP gesucht
Warum?
Eine LAN-Party, der Server wird nicht gefunden, ip a ist zu gesprächig.
Man muss das auch kürzer hinbekommen...
Lösung
alias MYIP='ip -br -f inet a | grep -v UNKNOWN'
-br → kompakt
-f inet → nur IPv4
das grep -v UNKOWN macht die Sache noch übersichtlicher
Wer GNOME nutzt,
kann sich die lokale IP auch dauerhaft anzeigen lassen (Extension „LAN IP Address“).
uptime
Kennt ja jeder
Ja, na klar, aber auch dieses alltägliche command kann ein paar Dinge mehr.
Es mindestens 2 Optionen, die auch einen Blick Wert sind.
1️⃣ -p 👉 Pretty
zum Beispiel:
uptime -p
up 10 weeks, 3 days, 23 hours, 57 minutes
2️⃣ -s 👉 since
zum Beispiel:
uptime -s
2025-10-21 09:56:25
sort
sort wird häufig in Shell Scripten in pipes eingesetzt.
Oft sieht man das Konstrukt
sort | uniq
Das funktioniert, aber das geht kürzer, schneller und wenn ihr mich fragt intuitiver
sort -u
👉 Denn sort hat uniq bereits an Bord!
uniq funktioniert nur auf sortierten Daten – sort -u erledigt beides in einem Schritt.
ein Brutales Beispiel
zcat other_vhosts_access.log.*.gz |cut -d'-' -f1|sort -u |wc -l
funktioniert, aber Zeitersparnis praktisch an der Nachweisgrenze