arko_renual/deploy/dev/arko-runner-watchdog.sh
URP2026 031f6b85e9
All checks were successful
deploy-dev / deploy (push) Successful in 34s
act_runner 폴링 정지 워치독 추가
러너가 작업 하나를 끝낸 뒤 폴링을 멈추는 문제가 있다. 프로세스는 살아 있고
Gitea로의 TCP 연결도 ESTABLISHED 인데 응답 없이 물려 있으며 CPU 사용량이 완전히
정지한다. nginx 경유 제거(직결 재등록)와 0.2.11->0.2.13 업그레이드로도 재현되어
근본 원인을 잡지 못했다.

arko-runner-watchdog.timer 가 1분마다 "90초 넘게 대기 중인 작업이 있는데
실행 중인 작업은 없는" 상태를 확인해 러너를 재기동한다. 실행 중인 작업이 있으면
건드리지 않으므로 배포 도중 끊길 위험은 없다.

검증: 대기 중이던 run 67을 워치독이 감지해 재기동했고 배포가 정상 완료됐다.
2026-07-29 18:45:25 +09:00

39 lines
1.9 KiB
Bash

#!/usr/bin/env bash
# act_runner 폴링 정지 감시 — 밀린 작업이 있는데 러너가 놀고 있으면 재기동한다.
#
# 설치 위치: /opt/arko-dev/bin/arko-runner-watchdog.sh (systemd timer가 1분마다 호출)
#
# 왜 필요한가:
# act_runner(0.2.11, 0.2.13 모두)가 작업 하나를 끝낸 뒤 폴링을 멈춘다.
# 프로세스는 살아 있고 Gitea로의 TCP 연결도 ESTABLISHED 인데 응답 없이 물려 있으며,
# CPU 사용량이 완전히 멈춘다(20초 관찰 시 utime/stime 변화 0). 재기동하면 밀린 작업을
# 즉시 집어간다. nginx 경유를 걷어내고 Gitea에 직결한 뒤에도 재현되어 러너 결함으로 판단했다.
#
# 안전장치: 실행 중인 작업이 있으면 절대 재기동하지 않는다(배포 도중 끊기면 ROOT가 반쪽이 된다).
set -uo pipefail
REPO_ID=55 # somang4819/arko_renual
SERVICE=arko-dev-runner
STALE_SEC=90 # 이 시간 이상 대기 중인 작업이 있으면 폴링이 멈춘 것으로 본다
LOG=/opt/arko-dev/logs/watchdog.log
mkdir -p "$(dirname "$LOG")"
log() { echo "[$(date +'%F %T')] $*" >> "$LOG"; }
PSQL() { su - postgres -c "psql -d gitea_db -A -t -c \"$1\"" 2>/dev/null | tr -d ' \r'; }
# 1) 실행 중인 작업이 있으면 손대지 않는다 (status 6 = Running)
RUNNING=$(PSQL "select count(*) from action_run_job where repo_id=$REPO_ID and status=6;")
[ "${RUNNING:-0}" = "0" ] || exit 0
# 2) 오래 대기 중인 작업 확인 (status 5 = Waiting)
WAITING=$(PSQL "select count(*) from action_run_job j join action_run r on r.id=j.run_id
where j.repo_id=$REPO_ID and j.status=5 and r.created < extract(epoch from now())-$STALE_SEC;")
[ "${WAITING:-0}" -gt 0 ] 2>/dev/null || exit 0
# 3) 러너가 살아 있는데도 안 가져간 것이므로 재기동
log "대기 작업 ${WAITING}건 감지 — $SERVICE 재기동"
systemctl restart "$SERVICE"
sleep 10
log "재기동 완료: $(systemctl is-active $SERVICE)"