Bash 스크립트에서 timeout 활용법
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
Bash 스크립트 개발자, 시스템 관리자, DevOps 엔지니어
핵심 요약
timeout
명령어는 지정 시간 내에 명령어가 완료되지 않을 경우 SIGTERM 신호를 보내 프로세스 종료를 시도함until
같은 shell built-in은timeout
에 직접 적용 불가하므로 bash -c로 래핑하거나 외부 스크립트 분리 후 적용해야 함curl
에 내장된--retry
및--connect-timeout
옵션을 활용하면 타임아웃 및 재시도 로직을 별도 스크립트 없이 구현 가능함
섹션별 세부 요약
1. 문제 상황: 무한 루프 발생
- 웹 서버 상태 확인을 위해
until
과curl
을 조합하여 사용 - 서버가 크래시하여
sleep
이 영원히 반복될 수 있는 무한 루프 발생 - 이는 서버의 비정상 종료 시 발생하며, 자동 복구가 불가능한 상황을 유발
2. timeout 명령어 활용
timeout
은 프로세스에 제한 시간을 설정하고, 시간 초과 시 SIGTERM 신호를 보내 프로세스 종료 시도- 예:
timeout 1s sleep 5
→ 1초 후sleep
프로세스 종료 시도 timeout
은 비정상 종료 코드(예: 124)를 반환하여 에러 처리 가능
3. timeout과 until의 조합 활용
timeout
과until
을 조합하여 타임아웃 제한을 적용- 예:
timeout 1m until curl ...; do sleep 1; done
- 그러나
until
은 shell built-in으로 직접timeout
적용 불가 - bash -c로 래핑하거나 외부 스크립트 분리 후
timeout
적용 가능
4. curl 내장 기능 활용
curl
에는--retry
,--connect-timeout
,--retry-max-time
등 재시도 및 타임아웃 설정 기능 내장- 예:
curl --retry 300 --retry-max-time 300 --connect-timeout 5 10.0.0.1:8080/health
- 이 기능을 활용하면 별도 스크립트 없이도 타임아웃 및 재시도 로직 구현 가능
5. POSIX 호환 타임아웃 구현
timeout
명령어가 없을 경우 sleep + for문 활용하여 타임아웃 구현 가능- 예:
times_up
함수로 10초 타임아웃 설정, 20회 반복 후 종료 read -t
활용한 타임아웃 구현 사례도 존재
6. 인자 전달 및 bash -c 사용 시 주의 사항
bash -c
사용 시 변수 전달을 위해"--"
사용 권장- 예:
bash -c 'some command "$1" "$2"' -- "$var1" "$var2"
--
는 옵션 종료 신호로,argv[0]
의 역할을 명확히 하며 POSIX 호환성 보장
7. 실무 적용 팁
- 타임아웃과 최대 재시도 횟수를 모두 설정하는 것이 서비스 헬스 체크의 최적 방법
- Kubernetes, AWS ECS, Docker Compose 등에서 의존성 설정을 통해 헬스 체크 수행 가능
- 타임아웃이 발생하면 true/false 반환하여 에러 처리 간단화 가능
결론
timeout
명령어는 프로세스 종료 제어에 유용하며,until
과의 조합 시 bash -c로 래핑하거나 외부 스크립트 분리 필요curl
의 내장 기능(--retry
,--connect-timeout
)을 활용하면 타임아웃 및 재시도 로직 구현이 간편함- POSIX 호환성과 변수 전달을 위한
"--"
사용을 권장하며, 타임아웃과 재시도 횟수 설정은 서비스의 안정성 향상에 기여함