- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: 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"