92 lines
2.8 KiB
Bash
92 lines
2.8 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
# Kill stuck Proxmox task processes for a specific VM
|
|||
|
|
# Usage: bash kill-stuck-proxmox-tasks.sh <VMID>
|
|||
|
|
|
|||
|
|
VMID="${1:-100}"
|
|||
|
|
|
|||
|
|
if [ -z "$VMID" ]; then
|
|||
|
|
echo "Usage: $0 <VMID>"
|
|||
|
|
echo "Example: $0 100"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "=== Killing Stuck Proxmox Tasks for VM $VMID ==="
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# 1. Find all task processes for this VM
|
|||
|
|
echo "1. Finding stuck processes..."
|
|||
|
|
TASK_PROCS=$(ps aux | grep -E "task.*$VMID|qm.*$VMID|qemu.*$VMID" | grep -v grep)
|
|||
|
|
|
|||
|
|
if [ -z "$TASK_PROCS" ]; then
|
|||
|
|
echo " ✅ No stuck processes found"
|
|||
|
|
else
|
|||
|
|
echo " Found processes:"
|
|||
|
|
echo "$TASK_PROCS" | while read line; do
|
|||
|
|
PID=$(echo "$line" | awk '{print $2}')
|
|||
|
|
CMD=$(echo "$line" | awk '{for(i=11;i<=NF;i++) printf "%s ", $i; print ""}')
|
|||
|
|
echo " PID $PID: $CMD"
|
|||
|
|
done
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# Extract PIDs
|
|||
|
|
PIDS=$(echo "$TASK_PROCS" | awk '{print $2}' | tr '\n' ' ')
|
|||
|
|
|
|||
|
|
# 2. Kill all task processes
|
|||
|
|
echo "2. Killing stuck processes..."
|
|||
|
|
for PID in $PIDS; do
|
|||
|
|
if kill -9 "$PID" 2>/dev/null; then
|
|||
|
|
echo " ✅ Killed PID $PID"
|
|||
|
|
else
|
|||
|
|
echo " ⚠️ Failed to kill PID $PID (may already be gone)"
|
|||
|
|
fi
|
|||
|
|
done
|
|||
|
|
echo ""
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 3. Also try pkill for any remaining processes
|
|||
|
|
echo "3. Cleaning up any remaining processes..."
|
|||
|
|
pkill -9 -f "task.*$VMID" 2>/dev/null && echo " ✅ Killed remaining task processes" || echo " ℹ️ No remaining task processes"
|
|||
|
|
pkill -9 -f "qm.*$VMID" 2>/dev/null && echo " ✅ Killed remaining qm processes" || echo " ℹ️ No remaining qm processes"
|
|||
|
|
sleep 2
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# 4. Verify no processes remain
|
|||
|
|
echo "4. Verifying no processes remain..."
|
|||
|
|
REMAINING=$(ps aux | grep -E "task.*$VMID|qm.*$VMID|qemu.*$VMID" | grep -v grep)
|
|||
|
|
if [ -z "$REMAINING" ]; then
|
|||
|
|
echo " ✅ No processes remaining"
|
|||
|
|
else
|
|||
|
|
echo " ⚠️ Some processes still running:"
|
|||
|
|
echo "$REMAINING"
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# 5. Remove lock file
|
|||
|
|
echo "5. Removing lock file..."
|
|||
|
|
if [ -f "/var/lock/qemu-server/lock-$VMID.conf" ]; then
|
|||
|
|
rm -f "/var/lock/qemu-server/lock-$VMID.conf"
|
|||
|
|
if [ ! -f "/var/lock/qemu-server/lock-$VMID.conf" ]; then
|
|||
|
|
echo " ✅ Lock file removed"
|
|||
|
|
else
|
|||
|
|
echo " ⚠️ Failed to remove lock file"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
else
|
|||
|
|
echo " ℹ️ Lock file already removed"
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# 6. Final verification
|
|||
|
|
echo "6. Final status check..."
|
|||
|
|
echo " Lock file: $([ ! -f "/var/lock/qemu-server/lock-$VMID.conf" ] && echo "✅ Removed" || echo "⚠️ Still exists")"
|
|||
|
|
echo " Processes: $([ -z "$(ps aux | grep -E 'task.*'$VMID'|qm.*'$VMID'|qemu.*'$VMID | grep -v grep)" ] && echo "✅ None" || echo "⚠️ Some remain")"
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
echo "=== Cleanup Complete ==="
|
|||
|
|
echo ""
|
|||
|
|
echo "Next steps:"
|
|||
|
|
echo "1. Try unlock: qm unlock $VMID"
|
|||
|
|
echo "2. Check VM status: qm status $VMID"
|
|||
|
|
echo "3. Check VM config: qm config $VMID"
|
|||
|
|
|