Initial commit
This commit is contained in:
commit
c38c8a5b2a
2 files changed
+189
No files matched your search
@@ -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
@@ -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
|
||||
Reference in new issue
Block a user