[Linux 셸 스크립트] 제어 구문 - 100 강제 종료될 때까지 파일 내려받기를 반복해 통신 확인하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 제어 구문 - 100 강제 종료될 때까지 파일 내려받기를 반복해 통신 확인하기

by 찬찬이 아빠 2021. 4. 20.
반응형
  1. 사용 명령어

(1) true

(2) curl

(3) sleep

 

 

  2. 키워드 & 사용처

(1) 키워드

무한 반복, 접속 확인, 내려받기

 

(2) 사용처

웹 서버 확인을 계속 반복하고 싶을 때 사용합니다.

 

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

 

 

  4. 스크립트

#!/bin/sh

 

# 확인 대상 URL

url=http://192.168.22.11/webapl/check       

 

# 무한 반복 시작

while true           

do

    # curl 명령어에서 테스트 대상 URL 내려받기

    # 파일 자체는 필요 없으므로 /dev/null로 처리

    curl -so /dev/null "$url"               

 

    # curl 명령어 종료 스테이터스로 OK, NG 판정

    if [ $? -eq 0 ]; then                 

        echo "[check OK]"             

    else                                         

        echo "[check NG]"             

    fi

 

    # 5초 대기

    sleep 5               

done

 

 

  5. 해설

이 스크립트는 셸 변수 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 명령어를 사용합니다.

 

예제에서는 우선 에서 대상 URL을 지정합니다. 이것은 접속을 확인할 URL입니다. 이어서 에서 무한 반복에 들어갑니다. 앞에서 본 것처럼 while 문과 true 명령어를 조합해서 무한 반복을 만듭니다.

 

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

 

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

 

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

 

 

<주의사항>

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

curl -I "http://192.168.22.1/"

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

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

fetch -qo /dev/null "$url"

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글