135 lines
3.9 KiB
Bash
135 lines
3.9 KiB
Bash
#!/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 |