File size: 3,531 Bytes
e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 99c21be e0d0466 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
#!/usr/bin/env bash
# removeRunpodSafely.sh — Remove o POD atual do RunPod após um atraso.
# Requisitos: bash, runpodctl; env RUNPOD_POD_ID presente.
# Comportamento: aguarda SECONDS_ALIVE (default 7200), barra de progresso,
# Ctrl+C cancela com segurança, janela final de 5s, e então REMOVE o pod.
set -Eeuo pipefail
umask 077
DEFAULT_SECONDS=7200 # 2 horas
MAX_SECONDS=$((14*24*3600)) # limite de segurança: 14 dias
PROGRESS_WIDTH=50
GRACE_SECONDS=5
#--- utils ---#
format_duration() {
local sec=${1:-0}
local h=$(( sec / 3600 ))
local m=$(( (sec % 3600) / 60 ))
local s=$(( sec % 60 ))
printf "%02d:%02d:%02d" "$h" "$m" "$s"
}
repeat_char() {
local n=${1:-0} ch="${2:-#}" buf=
(( n < 0 )) && n=0
printf -v buf '%*s' "$n" ''
echo "${buf// /$ch}"
}
#--- parâmetros ---#
SECONDS_TOTAL="${SECONDS_ALIVE:-$DEFAULT_SECONDS}"
if [[ ! "$SECONDS_TOTAL" =~ ^[0-9]+$ ]]; then
echo "ERRO: SECONDS_ALIVE precisa ser um inteiro >= 0 (em segundos)." >&2
exit 2
fi
if (( SECONDS_TOTAL > MAX_SECONDS )); then
echo "Aviso: SECONDS_ALIVE=$SECONDS_TOTAL excede o limite de segurança; limitando a $MAX_SECONDS."
SECONDS_TOTAL="$MAX_SECONDS"
fi
#--- pré-checagens mínimas ---#
if ! command -v runpodctl >/dev/null 2>&1; then
echo "ERRO: 'runpodctl' não encontrado no PATH. Execute dentro de um pod do RunPod." >&2
exit 3
fi
POD_ID="${RUNPOD_POD_ID:-}"
if [[ -z "$POD_ID" ]]; then
echo "ERRO: RUNPOD_POD_ID não definido. Este script deve rodar dentro de um pod do RunPod." >&2
exit 4
fi
#--- header ---#
echo "==================== REMOVER POD RUNPOD (SEGURO) ===================="
echo "Pod: $POD_ID"
echo "Ação: REMOVE (apagar/terminar)"
echo "Tempo até a remoção: $(format_duration "$SECONDS_TOTAL")"
echo "Pressione Ctrl+C a qualquer momento para CANCELAR sem remover."
echo "======================================================================"
#--- progresso + cancelamento ---#
CANCELLED=0
on_cancel(){ CANCELLED=1; }
trap on_cancel INT TERM
START_TS=$(date +%s)
END_TS=$(( START_TS + SECONDS_TOTAL ))
while :; do
(( CANCELLED )) && { echo -e "\nCancelado pelo usuário. Nada foi removido."; exit 130; }
NOW=$(date +%s)
(( NOW >= END_TS )) && break
ELAPSED=$(( NOW - START_TS ))
REMAIN=$(( END_TS - NOW ))
if (( SECONDS_TOTAL > 0 )); then
PERCENT=$(( (ELAPSED * 100) / SECONDS_TOTAL ))
FILLED=$(( (ELAPSED * PROGRESS_WIDTH) / SECONDS_TOTAL ))
else
PERCENT=100; FILLED=$PROGRESS_WIDTH
fi
(( FILLED > PROGRESS_WIDTH )) && FILLED=$PROGRESS_WIDTH
EMPTY=$(( PROGRESS_WIDTH - FILLED ))
BAR_FILLED=$(repeat_char "$FILLED" "#")
BAR_EMPTY=$(repeat_char "$EMPTY" ".")
printf "\r[%s%s] %3d%% | faltam %s " \
"$BAR_FILLED" "$BAR_EMPTY" "$PERCENT" "$(format_duration "$REMAIN")"
sleep 1 || true
done
echo
(( CANCELLED )) && { echo "Cancelado pelo usuário. Nada foi removido."; exit 130; }
#--- janela de segurança final ---#
echo "Tempo esgotado."
echo "Janela de segurança: removendo o pod em ${GRACE_SECONDS}s (Ctrl+C para abortar)."
for (( i=GRACE_SECONDS; i>0; i-- )); do
(( CANCELLED )) && { echo -e "\nCancelado durante a janela de segurança. Nada foi removido."; exit 130; }
printf "\rRemovendo em %ds... " "$i"
sleep 1 || true
done
echo
#--- remoção ---#
echo "Executando: runpodctl remove pod \"$POD_ID\""
if runpodctl remove pod "$POD_ID"; then
echo "Comando enviado. Este pod será encerrado."
else
rc=$?
echo "ERRO: falha ao executar 'runpodctl remove pod \"$POD_ID\"' (código $rc)" >&2
exit "$rc"
fi
|