witr – Freshes, in Go gekochtes Open-Source Diagnosewerkzeug (Apache 2.0), das die eine Frage beantwortet, die sich ausgefuchste Terminal-Krieger täglich stellen: „Warum läuft das?“

Wer regelmäßig per Terminal auf Servern oder der eigenen Kiste unterwegs ist, kennt das Szenario: Ein unbekannter Prozess rasiert Ressourcen, ein Port ist so hart blockiert wie deine Telefonnummer auf dem Handy der Ex, oder eine Datei ist aus noch unerklärlichen Gründen gesperrt. Standardwerkzeuge wie ps, lsof, ss, netstat, systemctl oder docker ps zeigen zwar zuverlässig, was gerade läuft, aber nicht zwingend, warum oder wer den Prozess gestartet hat. Die Kausalität darf man sich selbst zusammenpuzzeln.

Und genau hier zieht das Gewitr auf und witr wittert seine große Chance. Er macht dabei eiskalt den 31er und verrät frei nach Matthäus 26,75 den Prozess und dessen Herkunft (im Gegensatz zu den Medien), noch bevor der Hahn am Morgen kräht. Dabei verfolgt er Prozesse, Ports, Container und offene Dateien so hartnäckig wie der Staat Leute, die unliebsame Meme-Posts raushauen, zurück bis zur kompletten Entstehungskette und liefert das Ergebnis als lesbaren Baum, als JSON oder im interaktiven TUI-Dashboard.

Stabile Features:

  • JSON-Ausgabe für Skripte und Automation.
  • Online-Browser-Playground Sandkasten zum Ausprobieren ohne Installation
  • Prozess-, Port-, Datei- und Container-Lookup in einem Abwasch
  • Läuft als flottes Single Static Binary auf Linux, macOS, FreeBSD und Windows
  • Vollständige Ancestry-Kette (wer hat wen gestartet – inklusive der üblichen Verdächtigen)
  • Port- & Datei-Analyse: Ermittelt direkt, Welcher Dienst oder Prozess einen bestimmten Port blockiert oder eine Datei sperrt
  • Container-Erkennung: Identifiziert Abhängigkeiten über gängige Runtimes wie Docker, Podman oder Kubernetes hinweg
  • Kompakte Ausgabe & TUI: Neben einer übersichtlichen Baumansicht im Terminal steht auch ein schickes interaktives TUI-Dashboard zur Verfügung

Ansicht Firefox-Process und die zu dem Prozess dazugehörenden Prozess-Infos:

Nützliche witr-beständige Beispiele:

# Knowledge Base: witr (Process, Port & Container Diagnostics)
# Repository: https://github.com/pranshuparmar/witr
# Playground: https://pranshuparmar.github.io/witr/

#===========================================================
# 01. Installation (Ubuntu)
#===========================================================
# Offizielle direkte Methode (Vorher inspizieren!!!)
# curl -fsSL https://raw.githubusercontent.com/pranshuparmar/witr/main/install.sh | bash

# Offizielle Methode aber vorsichtiger
curl -fsSL https://raw.githubusercontent.com/pranshuparmar/witr/main/install.sh -o witr-install.sh
cat/bat oder less witr-install.sh
bash witr-install.sh

# Manuelle Methode (statisches Binary, Distro-unabhängig):
curl -LO https://github.com/pranshuparmar/witr/releases/latest/download/witr-linux-amd64
chmod +x witr-linux-amd64
sudo mv witr-linux-amd64 /usr/local/bin/witr

# Alternative über Paketmanager (Version hinkt hinterher)
sudo apt install witr

# Check
witr --version

#===========================================================
# 02. Port- & Netzwerk-Diagnose
#===========================================================
# Mehrere Ports gleichzeitig checken
sudo witr --port 443 --port 3000

# Welcher Prozess belegt den DB- oder Web-Port?
sudo witr --port 5432                     # PostgreSQL
sudo witr --port 3306                     # MariaDB / MySQL
sudo witr --port 80 --port 443            # Nginx/Caddy

# Kubernetes-Ports
sudo witr --port 10250                    # kubelet (Node-Agent)
sudo witr --port 2379 --port 2380         # etcd (Control-Plane)
sudo witr --port 6443 --port 10257        # API-Server / Controller-Manager

# Sicherheitsrelevante Ports (öffentliches Binding erkennen)
sudo witr --port 2375 --warnings          # Docker API (sollte NICHT öffentlich sein)
sudo witr --port 5432 --warnings          # PostgreSQL öffentlich erreichbar?
sudo witr --port 3306 --warnings          # MariaDB öffentlich erreichbar?

#===========================================================
# 03. DB-Diagnose (PostgreSQL & MariaDB)
#===========================================================
# Defaultcheck
sudo witr postgres

# Prozessbäume & Worker-Hierarchien analysieren
sudo witr postgres --tree               # nur Hierarchie
sudo witr mariadbd --verbose            # volle Details + erweiterte Infos

# Lock-Dateien nach Crash/Restart checken (welcher Prozess blockiert den Start?)
sudo witr --file /var/run/mysqld/mysqld.pid                 # MariaDB Lock
sudo witr --file /var/lib/postgresql/*/main/postmaster.pid  # PostgreSQL

# Verwaiste Prozesse & Auffälligkeiten anzeigen
sudo witr postgres --warnings

#===========================================================
# 04. Container & Kubernetes Troubleshooting
#===========================================================
# Zeigt, welcher Prozess den Docker-/Containerd-Socket aktuell hält
sudo witr --file /var/run/docker.sock
sudo witr --file /run/containerd/containerd.sock

# Container-Prozesse auf dem Host zurückverfolgen
sudo witr --container 
sudo witr --container  --verbose   # inkl. Mounts, Netzwerke, Compose-Metadaten
sudo witr containerd-shim

# Paketmanager-Locks (hängende Updates identifizieren)
sudo witr --file /var/lib/dpkg/lock-frontend

#===========================================================
# 05. Erweiterte Prozessanalyse & Automation
#===========================================================
# Interaktiver TUI (schnellste Art, ein System zu erkunden)
sudo witr

# Prozessdetails mit Umgebungsvariablen & File-Deskriptoren
sudo witr node --env --verbose
sudo witr nginx --warnings

# JSON-Ausgabe für Scripts & Monitoring (Bsp. PID ermitteln)
sudo witr --port 5432 --json | jq '.[0].pid'

# Stramm formatierte Ausgabe für Logfiles / CI (ohne Farbcodes)
sudo witr sshd --short --no-color

# Exit-Code-basierte Health-Checks (für Cron/Monitoring)
sudo witr --port 5432 --short
case $? in
  0) echo "Postgres läuft, keine Warnungen" ;;
  1) echo "Postgres läuft, aber mit Warnungen" ;;
  2) echo "Postgres NICHT erreichbar" ;;
esac

#===========================================================
# Misc
#===========================================================
# Wichtigste Flags (Kurzform | Langform | Beschreibung):
# -o, --port         Port(s) abfragen, die ein Prozess hält (wiederholbar)
# -p, --pid          PID(s) direkt abfragen (wiederholbar)
# -f, --file         Datei(en) abfragen, die ein Prozess offen hält (wiederholbar)
# -c, --container    Container abfragen nach Name/Image/Command/Compose-Labels
# -t, --tree         Nur die Ahnenkette als Baum (inkl. Kindprozesse, Target hervorgehoben. Reduzierte Ausgabe)
# -s, --short        Nur die Ahnenkette ausgeben (kompakt, eine Zeile)
# -x, --exact        Exakte Namenssuche statt Substring-/Fuzzy-Match
#     --env          Umgebungsvariablen des Prozesses mit ausgeben
#     --verbose      Erweiterte Prozessinfos (Mounts, Netzwerke, Compose-Metadaten bei Containern)
#     --warnings     Nur Warnungen ausgeben (z.B. root, public bind, CAP_SYS_ADMIN, LD_PRELOAD)
#     --json         Ausgabe als JSON (für Scripts/Monitoring/CI)
#     --no-color     Farbcodes deaktivieren (stabil für Logfiles/CI usw.)
# -i, --interactive  Interaktiver sexy TUI-Modus (Tabs: Prozesse, Ports, Container, Locks)
# -h, --help         Hilfe inkl. Beispiele anzeigen
# -v, --version      Version ausgeben

# Hinweise:
# - Alle Zielflags (--pid, --port, --file, --container) sind wiederholbar & lassen sich mischen (z.B. witr nginx --port 5432 --pid 1234).
# - Exit-Codes: 0 = OK | 1 = Warnungen | 2 = nicht gefunden | 3 = Permission denied | 4 = ungültige Eingabe | 5 = interner Fehler