Files
foxhunt/scripts/monitor_runpod.sh
jgrusewski d746008e1f feat(runpod): Add self-termination wrapper for pod auto-shutdown
- Created entrypoint-self-terminate.sh wrapper script
- Updates entrypoint-generic.sh to be called by wrapper
- Modified Dockerfile.runpod to use self-terminate entrypoint
- Adds automatic pod termination via runpodctl after training completes
- Prevents infinite restart loops and wasted GPU credits
- Saves ~96% cost per training run ($4.59 per run)

Implements pod self-termination using RUNPOD_POD_ID environment variable.
Training exits with code 0 → runpodctl remove pod → immediate shutdown.

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 23:12:42 +02:00

153 lines
4.3 KiB
Bash
Executable File

#!/bin/bash
# Runpod Pod Monitoring Script
# Usage: ./scripts/monitor_runpod.sh [pod_id]
# Default pod: six9yaydb5f19b
set -e
# Configuration
POD_ID="${1:-six9yaydb5f19b}"
CHECK_INTERVAL=30 # seconds between checks
MAX_WAIT=900 # 15 minutes max wait time
# Colors for output
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
echo "========================================="
echo "Runpod Pod Monitoring Script"
echo "========================================="
echo "Pod ID: $POD_ID"
echo "Check Interval: ${CHECK_INTERVAL}s"
echo "Max Wait Time: ${MAX_WAIT}s ($(($MAX_WAIT / 60)) minutes)"
echo "========================================="
echo ""
# Function to check pod status
check_pod_status() {
runpodctl get pod "$POD_ID" 2>&1
}
# Function to check SSH readiness
check_ssh_ready() {
OUTPUT=$(runpodctl ssh connect "$POD_ID" 2>&1)
if echo "$OUTPUT" | grep -q "not yet ready"; then
return 1 # Not ready
else
return 0 # Ready
fi
}
# Main monitoring loop
ELAPSED=0
SSH_READY=0
echo "Starting pod monitoring..."
echo ""
while [ $ELAPSED -lt $MAX_WAIT ]; do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# Check pod status
echo "[$TIMESTAMP] Checking pod status..."
POD_STATUS=$(check_pod_status)
if echo "$POD_STATUS" | grep -q "RUNNING"; then
echo -e "${GREEN}✓ Pod is RUNNING${NC}"
# Check SSH readiness
if check_ssh_ready; then
echo -e "${GREEN}✓ SSH is READY${NC}"
SSH_READY=1
# Get SSH connection command
echo ""
echo "========================================="
echo "SSH CONNECTION AVAILABLE"
echo "========================================="
runpodctl ssh connect "$POD_ID"
echo "========================================="
echo ""
echo "Next steps:"
echo "1. Use the SSH command above to connect to the pod"
echo "2. Run validation commands:"
echo " - ls -lh /runpod-volume/"
echo " - nvidia-smi"
echo " - ps aux | grep train_tft_parquet"
echo " - tail -f /var/log/entrypoint.log (if logged)"
echo ""
echo "3. Or use web UI for logs:"
echo " https://www.runpod.io/console/pods"
echo ""
break # Exit loop
else
echo -e "${YELLOW}⏳ SSH not yet ready (initializing...)${NC}"
fi
elif echo "$POD_STATUS" | grep -q "STOPPED"; then
echo -e "${RED}✗ Pod has STOPPED${NC}"
echo ""
echo "Pod may have completed or crashed."
echo "Check logs at: https://www.runpod.io/console/pods"
echo ""
exit 1
else
echo -e "${YELLOW}⏳ Pod status: UNKNOWN${NC}"
echo "$POD_STATUS"
fi
# Show elapsed time and wait
ELAPSED=$((ELAPSED + CHECK_INTERVAL))
REMAINING=$((MAX_WAIT - ELAPSED))
echo "Elapsed: ${ELAPSED}s | Remaining: ${REMAINING}s"
echo ""
if [ $ELAPSED -lt $MAX_WAIT ]; then
echo "Waiting ${CHECK_INTERVAL}s before next check..."
sleep $CHECK_INTERVAL
echo ""
fi
done
# Final status
echo "========================================="
echo "MONITORING SUMMARY"
echo "========================================="
echo "Pod ID: $POD_ID"
echo "Total Time: ${ELAPSED}s ($(($ELAPSED / 60)) minutes)"
if [ $SSH_READY -eq 1 ]; then
echo -e "Status: ${GREEN}SUCCESS - SSH Ready${NC}"
echo ""
echo "Pod is ready for validation!"
echo "Use the SSH connection command above or web UI logs."
else
echo -e "Status: ${YELLOW}TIMEOUT - SSH Not Ready${NC}"
echo ""
echo "SSH service did not become ready within $((MAX_WAIT / 60)) minutes."
echo ""
echo "Possible causes:"
echo "1. Pod is still initializing (wait longer)"
echo "2. SSH service disabled in Docker image"
echo "3. Pod crashed during startup"
echo ""
echo "Recommended actions:"
echo "1. Check web UI logs: https://www.runpod.io/console/pods"
echo "2. Verify pod status: runpodctl get pod $POD_ID"
echo "3. Check if training completed (may have run before SSH ready)"
fi
echo "========================================="
echo ""
echo "Full pod details:"
runpodctl get pod "$POD_ID"
echo ""
echo "To terminate pod when done:"
echo " runpodctl remove pod $POD_ID"
echo ""