commit c38c8a5b2a9a38a683be09ea9d558861285edcdd Author: Thorsten Date: Tue May 12 15:51:09 2026 +0200 Initial commit diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..f6aae39 --- /dev/null +++ b/README.MD @@ -0,0 +1,54 @@ +# killguest + +`killguest` ist ein kleines Shell-Tool für Proxmox VE, um hängende VMs oder LXC-Container zuverlässig zu beenden, +wenn Standardbefehle wie `qm stop` oder `pct stop` versagen. + +## Features + +- Automatische Erkennung (VM oder LXC) +- Anzeige von ID, Name, Typ und Prozesse `bevor` beendet wird + +## Installation + +```bash +nano /usr/local/bin/killguest +chmod +x /usr/local/bin/killguest +``` + +## Nutzung + + killguest + +Beispiele: + + killguest 125 + killguest 201 + +## Funktionsweise + +### VM + +Findet den QEMU-Prozess: + + /usr/bin/kvm -id + +und beendet ihn mit: + + kill -9 + +### LXC + +Findet Prozesse über cgroups: + + /proc/*/cgroup → lxc/ + +und beendet alle zugehörigen Prozesse. + +## Warnung + +Dieses Tool führt einen Hard-Stop durch (wie Strom ziehen). Nur +verwenden, wenn normale Stop-Befehle nicht funktionieren. + +## Fazit + +killguest ist ein Notfall-Tool für hartnäckige Hänger in Proxmox. diff --git a/killguest.sh b/killguest.sh new file mode 100644 index 0000000..c48c244 --- /dev/null +++ b/killguest.sh @@ -0,0 +1,135 @@ +#!/bin/bash + +ID="$1" + +if [ -z "$ID" ]; then + echo "❌ Usage: killguest " + exit 1 +fi + +echo "──────────────────────────────────────────────────────────" +echo "🔍 Virtuelle Maschine oder Container wird gesucht..." +echo "──────────────────────────────────────────────────────────" + +# Typ bestimmen +if qm status "$ID" &>/dev/null; then + TYPE="vm" +elif pct status "$ID" &>/dev/null; then + TYPE="ct" +else + echo "❌ Keine VM oder LXC mit ID $ID gefunden." + exit 1 +fi + +# Name ermitteln +if [ "$TYPE" = "vm" ]; then + NAME=$(qm config "$ID" | grep "^name:" | awk '{print $2}') +elif [ "$TYPE" = "ct" ]; then + NAME=$(pct config "$ID" | grep "^hostname:" | awk '{print $2}') +fi + +[ -z "$NAME" ] && NAME="unknown" + +# Ausgabe +if [ "$TYPE" = "vm" ]; then + TYPE_LABEL="VM" +else + TYPE_LABEL="LXC" +fi + +echo "" +echo "📦 Maschine gefunden:" +echo "♻️ Name: $NAME" +echo "⚙️ Typ: $TYPE_LABEL" +echo "" + +######################################## +# VM +######################################## +if [ "$TYPE" = "vm" ]; then + + PID=$(ps -eo pid,cmd | grep -E "/usr/bin/kvm.*-id $ID" | grep -v grep | awk '{print $1}') + + if [ -z "$PID" ]; then + echo "❌ Kein QEMU Prozess gefunden. VM kann nicht beendet werden." + exit 1 + fi + + echo "📋 Gefundener Prozess:" + ps -fp $PID + + echo "" + echo "──────────────────────────────────────────────────────────" + echo "" + + read -p "💣 VM hart beenden? (y/N): " CONFIRM + [[ "$CONFIRM" =~ ^[Yy]$ ]] || exit 0 + + echo "" + echo "──────────────────────────────────────────────────────────" + echo "" + + echo "🔥 Beende VM (PID $PID)..." + kill -9 $PID + + sleep 1 + + if ps -p $PID > /dev/null 2>&1; then + echo "❌ Prozess lebt noch." + exit 1 + else + echo "✅ VM wurde beendet." + fi + + echo "" + echo "──────────────────────────────────────────────────────────" + echo "" +fi + +######################################## +# LXC +######################################## +if [ "$TYPE" = "ct" ]; then + + # cgroup Methode + PIDS=$(grep -l "lxc/$ID" /proc/*/cgroup 2>/dev/null | cut -d'/' -f3) + + # fallback für andere layouts + if [ -z "$PIDS" ]; then + PIDS=$(ps -eo pid,cmd | grep "lxc-start.*$ID" | grep -v grep | awk '{print $1}') + fi + + if [ -z "$PIDS" ]; then + echo "❌ Keine Prozesse gefunden. Container kann nicht beendet werden." + exit 1 + fi + + + echo "📋 Gefundene Prozesse:" + for PID in $PIDS; do + ps -fp $PID 2>/dev/null + done + + echo "" + echo "──────────────────────────────────────────────────────────" + echo "" + + read -p "💣 Container hart beenden? (y/N): " CONFIRM + [[ "$CONFIRM" =~ ^[Yy]$ ]] || exit 0 + + echo "" + echo "──────────────────────────────────────────────────────────" + echo "" + echo "🔥 Beende Container $ID..." + + for PID in $PIDS; do + kill -9 $PID 2>/dev/null + done + + echo "✅ Container Prozesse beendet." + + echo "" + echo "──────────────────────────────────────────────────────────" + echo "" + +fi \ No newline at end of file