Bash 스크립트에서 timeout 활용법 및 curl 적용 팁

Bash 스크립트에서 timeout 활용법

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

Bash 스크립트 개발자, 시스템 관리자, DevOps 엔지니어

핵심 요약

  • timeout 명령어는 지정 시간 내에 명령어가 완료되지 않을 경우 SIGTERM 신호를 보내 프로세스 종료를 시도함
  • until 같은 shell built-in은 timeout에 직접 적용 불가하므로 bash -c로 래핑하거나 외부 스크립트 분리 후 적용해야 함
  • curl에 내장된 --retry--connect-timeout 옵션을 활용하면 타임아웃 및 재시도 로직을 별도 스크립트 없이 구현 가능함

섹션별 세부 요약

1. 문제 상황: 무한 루프 발생

  • 웹 서버 상태 확인을 위해 untilcurl을 조합하여 사용
  • 서버가 크래시하여 sleep이 영원히 반복될 수 있는 무한 루프 발생
  • 이는 서버의 비정상 종료 시 발생하며, 자동 복구가 불가능한 상황을 유발

2. timeout 명령어 활용

  • timeout프로세스에 제한 시간을 설정하고, 시간 초과 시 SIGTERM 신호를 보내 프로세스 종료 시도
  • 예: timeout 1s sleep 5 → 1초 후 sleep 프로세스 종료 시도
  • timeout비정상 종료 코드(예: 124)를 반환하여 에러 처리 가능

3. timeout과 until의 조합 활용

  • timeoutuntil을 조합하여 타임아웃 제한을 적용
  • 예: timeout 1m until curl ...; do sleep 1; done
  • 그러나 untilshell 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 호환성변수 전달을 위한 "--" 사용을 권장하며, 타임아웃과 재시도 횟수 설정은 서비스의 안정성 향상에 기여함