Bash 스크립트에서 timeout 활용법

1 day ago 5

  • Bash 스크립트에서 웹 서버 상태 확인을 위해 반복적인 접속 시도를 진행함
  • 서버가 예기치 않게 무한 루프에 빠질 수 있는 문제가 발생함
  • 이를 해결하기 위한 도구로 timeout 명령어의 존재와 동작 방식을 소개함
  • timeout은 명령 실행 제한 시간을 정하고, 초과 시 신호를 보내 프로세스 종료를 시도함
  • until과 같은 shell built-in에는 직접 적용이 불가해 bash 프로세스 래핑 또는 스크립트 분리를 통해 해결 가능함

Bash 스크립트에서 웹 서버 대기와 무한 루프 문제

  • 실무에서 Bash 스크립트를 활용해 웹 서버 세팅 및 상태 체크를 수행함
  • 서버가 올라오는 동안 다음 작업을 보류하는 구조로, 기본적으로 문제없이 동작함
  • 그러나 서버가 시작 중 크래시가 발생하는 경우 무한 루프에 빠져 해결이 필요함

until 사용 예시와 한계

  • 다음과 같은 구문으로 웹 서버 Health 체크를 반복함 until curl --silent --fail-with-body 10.0.0.1:8080/health; do sleep 1 done
  • 서버가 실패할 때에는 sleep 1이 영원히 반복되는 상황이 발생함

timeout 유틸리티의 도입

  • timeout 명령어는 지정한 시간 안에 명령어가 완료되지 않으면 신호(SIGTERM 등) 를 보내 종료함
  • 예: timeout 1s sleep 5의 경우, 1초가 지난 후 sleep 프로세스 종료 시도
  • 종료 시 비정상 종료 코드(예: 124) 를 반환함

timeout과 until의 조합 시도 및 문제점

  • 자연스레 timeout과 until을 아래처럼 조합 시도함 timeout 1m until curl ...; do sleep 1 done
  • 하지만 timeout은 프로세스 대상으로 신호 전송이 가능하나, until은 shell 내장 키워드로 직접 적용 불가

해결 방법: Bash 프로세스 래핑 또는 외부 스크립트 사용

  • until 루프 전체를 bash -c로 래핑하여 별도 프로세스로 실행하면 timeout 적용 가능함 timeout 1m bash -c "until curl ...; do sleep 1; done"
  • 또는 루프 부분을 외부 Bash 스크립트 분리 후, 해당 스크립트에 timeout 적용 가능함 timeout 1m ./until.sh
  • shell built-in에는 직접 timeout이 적용되지 않지만, 위 방법으로 원하는 동작을 달성 가능함

Read Entire Article