Initial commit

This commit is contained in:
Thorsten committed 2026-05-12 15:51:09 +02:00
commit c38c8a5b2a
2 files changed
+189

No files matched your search

+54
View File
@@ -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 <ID>
Beispiele:
killguest 125
killguest 201
## Funktionsweise
### VM
Findet den QEMU-Prozess:
/usr/bin/kvm -id <vmid>
und beendet ihn mit:
kill -9 <PID>
### LXC
Findet Prozesse über cgroups:
/proc/*/cgroup → lxc/<ctid>
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.
+135
View File
@@ -0,0 +1,135 @@
#!/bin/bash
ID="$1"
if [ -z "$ID" ]; then
echo "❌ Usage: killguest <vmid|ctid>"
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