우분투 실전 명령어 | timeout과 재시도로 불안정 명령 안정화
문제가 있는 서버나 외부 API를 호출할 때 명령이 끝없이 멈추면 배치 작업 전체가 지연됩니다. timeout과 간단한 재시도 루틴만 넣어도 장애 전파를 크게 줄일 수 있습니다.
언제 쓰는가
- curl, rsync, ssh 같은 명령이 간헐적으로 멈추거나 오래 걸릴 때
- 크론 작업에서 한 번 실패를 바로 장애로 보지 않고 몇 번 더 시도하고 싶을 때
- 파이프라인 단계별 최대 실행 시간을 강제하고 싶을 때
바로 쓰는 명령어
# 15초 넘으면 종료, 종료 신호 후 3초 유예
timeout -s TERM -k 3s 15s curl -fsS https://example.com/health
# 재시도 3회, 시도 간 5초 대기
for i in 1 2 3; do
timeout 20s rsync -az /data/ backup:/srv/data/ && break
echo "[warn] rsync 실패: ${i}회차" >&2
sleep 5
done
# 함수로 재사용 가능한 retry 패턴
retry() {
local max="$1"; shift
local delay="$1"; shift
local n=1
while true; do
"$@" && return 0
if [ "$n" -ge "$max" ]; then
return 1
fi
n=$((n+1))
sleep "$delay"
done
}
retry 4 3 timeout 10s ssh [email protected] 'sudo systemctl is-active nginx'
핵심 옵션/패턴
- timeout 10s cmd: 실행 시간이 10초를 넘으면 강제 종료
- timeout -k 5s 30s cmd: 먼저 TERM을 보내고 5초 뒤에도 안 끝나면 KILL
- timeout --preserve-status: timeout 개입 시에도 원래 종료 코드를 최대한 유지하고 싶을 때 사용
- retry는 무한 반복 대신 횟수 상한을 둬야 안전함
- 재시도 간격은 고정값도 가능하지만, 운영에서는 2초, 4초, 8초처럼 점진 증가 패턴이 더 안정적임
명령 출력 예시
$ timeout -k 3s 5s curl -fsS https://10.10.10.10/health
curl: (28) Connection timed out after 5001 milliseconds
$ echo $?
124
$ retry 3 2 timeout 5s ssh app@web-1 'curl -fsS http://127.0.0.1:8080/ready'
[1] failed, retrying in 2s...
[2] failed, retrying in 2s...
ok
자주 하는 실수
- timeout 종료 코드 124를 일반 명령 실패 코드와 구분하지 않아 원인 분석이 꼬임
- 재시도 루프에 종료 조건을 안 넣어 무한 반복으로 장애를 키움
- sleep 간격 없이 즉시 재시도해서 대상 시스템 부하를 더 올림
- timeout만 걸고 표준에러 로그를 버려서 실제 실패 원인을 놓침
검증 방법
# 의도적으로 지연시켜 timeout 동작 확인
TIMEFORMAT='elapsed=%R'; time timeout 2s bash -c 'sleep 5'
echo $?
# 재시도 횟수/간격 로그 확인
bash -x ./deploy.sh 2>&1 | grep -E 'retry|timeout|failed'
# cron 환경에서도 동일 동작하는지 즉시 테스트
env -i PATH=/usr/bin:/bin bash -lc 'timeout 3s curl -I https://example.com'
운영 팁
짧은 timeout은 빠른 실패로 복구를 돕지만, 너무 짧으면 정상 구간까지 실패로 처리합니다. 서비스별 정상 응답 시간을 먼저 측정한 뒤 p95 기준으로 timeout을 잡는 게 실전에서 가장 덜 흔들립니다. 또 재시도는 모든 명령에 넣기보다 네트워크 I/O 구간에만 제한적으로 적용해야 전체 실행 시간이 통제됩니다.
출처
- GNU Coreutils Manual
- curl Documentation
- rsync Manual
- Linux man-pages Project