제어 구문 예제_03 강제 종료될 때까지 파일 내려받기를 반복해 통신 확인하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: true, curl, sleep
키워드: 무한 반복, 접속 확인, 내려받기
사용처: 웹 서버 확인을 계속 반복하고 싶을 때


실행예제

$ ./download-loop.sh
[check OK]
[check OK]
[check OK]
[check OK]
[check OK]
^C  <------------------ Ctrl + C 키를 입력할 때까지 계속 실행

스크립트

#!/bin/sh

# 확인 대상 URL
url=http://192.168.22.1/webapl/check #-------- 1

# 무한 반복 시작
while true  #--------------------------------- 2
do
  # curl 명령어에서 테스트 대상 URL 내려받기
  # 파일 자체는 필요 없으므로 /dev/null로
  curl -so /dev/null "$url"  #---------------- 3

  #curl 명령어 종료 스테이터스로 OK, NG 판정
  if [ $? -eq 0 ]; then  #-------------------- 4(if문)
    echo "[check OK]"
  else
    echo "[check NG]"
  fi

  # 5초 대기 
  sleep 5  #---------------------------------- 5
done

   

해설

이 스크립트는 셸 변수 url로 지정한 URL에서 5초마다 내려받아서 결과를 OK, NG로 표시합니다. 5초 간격을 Ctrl + C를 입력할 때까지 무한으로 내려받기를 반복합니다. 웹 서버에 연속으로 접속해서 확인할 때 사용하면 됩니다.

셸 스크립트에서 무한 반복하는 몇 가지 방법이 있지만 다른 사람이 작성한 스크립트를 읽을 때 이해할 수 있도록 다음의 표기법을 기억해두기 바랍니다.

# 1을 하드 코딩해서 무한 반복
while [ 1 ]
do
    (처리)
done


# true 명령어로 무한 반복
while true
do
    (처리)
done


# :(널 명령어)로 무한 반복
while :
do
    (처리)
done

그중에서도 “while true”는 true 명령어가 참을 돌려주는 것이 분명하므로 코드를 봤을 때 의미가 알기 쉬워서 선호됩니다.

하지만 true 명령어는 시스템에 따라서 외부 명려어라서 기종 의존성이 있습니다. 최근 리눅스나 Mac, FreeBSD의 true 명령어는 셸 내장 명령어지만 예전 솔라리스(Solaris) 등에서는 외부 명령어 /bin/true입니다. 또한, 극히 드물지만 true 명령어가 설치되지 않은 시스템도 있습니다. 따라서 스크립트 이식성을 중요하게 생각해서 true 명령어보다는 :(널 명령어)으로 무한 반복하는 while : 을 선호하는 사람도 있습니다.

그러나 예제에서는 한눈에 파악하기 쉽게 true 명령어를 사용합니다.

예제에서는 우선 1에서 대상 URL을 지정합니다. 이것은 접속을 확인할 URL입니다.

이어서 2에서 무한 반복에 들어갑니다. 앞에서 본 것처럼 while 문과 true 명령어를 조합해서 무한 반복을 만듭니다.

3에서 curl 명령어를 사용해서 대상 URL에서 파일을 내려받습니다. 확인 목적이므로 내려받은 파일을 보관할 필요가 없으므로 출력할 곳을 지정하는 -o 옵션으로 /dev/null을 지정해서 파일을 저장하지 않습니다. 또한 curl 명령어로 내려받기가 정상적으로 끝났는지만 확인하고 싶으므로 사이렌스 모드를 의미하는 -s 옵션을 써서 조용히 처리하도록 출력을 제어합니다.

curl 명령어가 정상적으로 끝났는지, 웹 서버에서 정상적으로 파일을 내려받았는지를 명령어 종료 스테이터스 $?가 0인지로 판별할 수있습니다. 4에서 $?가 0이라면 [check OK], 0이 아니라면 [check NG]를 표시합니다. 이때 HTTP 스테이터스는 보지 않으므로 경로를 틀리는 등의 이유로 웹 서버가 404 Not Found를 돌려주거나 500 Internal Server Error를 돌려줘도 [check OK]가 됩니다. 즉, 이 예제는 웹 서버 접속에 성공하면 OK인 스크립트입니다.

끝으로 5에서 5초간 대기합니다. 이런 무한 반복 스크립트는 네트워크 대역이나 CPU 자원을 과도하게 소비할 수도 있으므로 sleep 명령어로 대기 시간을 두는 것이 좋습니다.

   

주의사항

  • 순수하게 웹 서버 네트워크 확인만 하고 싶다면 파일을 내려받을(GET 메소드) 필요가 없으므로 컨텐츠를 내려받지 않는 HEAD 메소드를 사용해도 됩니다. 다음처럼 curl 명령어 -I 옵션을 사용하면 HEAD 메소드로 접속할 수 있습니다. 이렇게 하면 HTTP 헤더만 취득합니다.

    curl -I "http://192.168.22.1/"
    
  • 이 스크립트는 무한 반복하므로 영원히 웹 서버에 접속합니다. 특히 외부 사이트를 확인하는 경우는 특정 시간이 지나면 멈추게 한다든지 해서 직접 확인하는 동안만 실행하는 편이 좋습니다.

  • FreeBSD는 curl 명령어가 표준 설치되지 않으므로 fetch 명령어를 사용합니다.

    fetch -qo /dev/null "$url"