파일처리_05 파일 내용을 삭제해서 빈 파일로 만들기(null, :(널명령어))

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

명령어: :(널명령어), uptime, sleep
키워드: 빈 파일, 초기화
사용처: 스크립트 시작할 때 기록 파일, 임시 파일을 초기화하고 싶을 때

실행 예제

$ ./null.sh

스크립트

#!/bin/sh

# uptime 명령어 기록 파일 정의
uptimelog="uptime.log" # ----------- 1

# 널 명령어로 빈 파일로 초기화
: > $uptimelog

# 10초마다 6번, uptime 명령어 실행
for i in 1 2 3 4 5 6 # ------------- 2
do
  uptime >> $uptimelog # ----------- 3
  sleep 10
done

   

해설

이 스크립트는 현재 서버 부하 상태를 확인합니다. 로드 평균치(서버 부하)를 출력하는 uptime 명령어 출력 결과를 로그 파일에 10초마다 6번, 즉 1분간 출력합니다. 스크립트 실행 후, 아래처럼 uptime.log에 부하 평균치를 기록합니다.

  • 부하 평균치 로그 파일

    22:33:46 up 6 days, 23:51, 2 users, load average: 1.15, 1.48, 1.57
    22:33:56 up 6 days, 23:51, 2 users, load average: 1.28, 1.50, 1.57
    22:34:06 up 6 days, 23:51, 2 users, load average: 1.47, 1.53, 1.58
    22:34:16 up 6 days, 23:52, 2 users, load average: 1.48, 1.53, 1.58
    22:34:26 up 6 days, 23:52, 2 users, load average: 1.41, 1.51, 1.57
    22:34:36 up 6 days, 23:52, 2 users, load average: 1.94, 1.63, 1.61
    

한편, uptime 명령어로 출력한 부하 평균치(load average)는 왼쪽에서부터 과거 1분간, 5분간, 15분간 평균치입니다. 부하 평균치는 서버에서 대기 상태인 작업 수를 나타내는 숫자입니다. 이 값이 크면 대기 상태인 작업이 많은 즉, CPU나 디스크 등 리소스가 부족해서 서버 부하가 높은 상태라고 판단할 수 있습니다. 따라서 서버 부하 측정을 위해 예제와 같은 스크립트로 자료를 수집하는 경우가 많습니다.

스크립트 실행 중에 상태 기록이나 저장하려고 작업 파일을 이용하는 프로그램이 많습니다. 그때 주의해야 하는 것은 이전에 실행되었을 때 만든 파일이 남아 있거나, 이상 종료로작업 파일 흔적이 남은 것입니다.

그런 문제를 피하기 위해 스크립트에서는 우선 빈 작업 파일을 작성해서 환경을 초기화하는 방법을 사용합니다. 파일을 비우는 데는 이 예제처럼 아무것도 출력하지 않는 :(널 명령어)을 리다이렉트하는 방법이 간단해서 자주 쓰입니다.

1은 :(널 명령어)을 이용해서 빈 파일을 작성하는 부분입니다. 여기서는 : 출력 결과를 리다이렉트합니다. :은 아무것도 출력하지 않으므로 파일이 없으면 빈 파일이 작성되고 기존 파일이면 내용을 지우고 빈 파일로 만듭니다. 따라서 로그 파일(uptime.log)이 존재하는지 신경 쓰지 않아도 됩니다.

2로 uptime 명령어를 반복하기 위해 for문을 사용합니다. 여기에서는 6번 반복하므로 “1 2 3 4 5 6” 목록을 지정합니다. 단순한 반복문 카운터이므로 6개의 인수가 있으면 되므로 값 자체는 별 의미가 없습니다. 따라서 “a b c d e f”라도 되지만 관습적으로 반복문은 숫자를 사용합니다.

3은 로그 파일에 uptime 명령어 출력 결과를 기록합니다. 여기에서는 반복마다 내용을 덮어쓰지 않도록 추가 리다이렉트 »를 사용합니다. 이후 sleep 명령어로 10초간 기다렸다가 다시 uptime 명령어를 실행하기를 6번 반복합니다.   새로운 파일을 만들거라면 touch 명령어를 사용하면 될 것 같지만 toouch 명령어는 기존 파일이 있을 때 갱신일을 변경할 뿐이므로 빈 파일을 작성할 수 없어서 초기화에는 사용하지 않습니다.

  • 기존 파일이 존재하면 빈 파일이 되지 않음

    $ cat uptime.log
    22:33:46 up 6 days, 23:51, 2 users, load average: 1.15, 1.48, 1.57
    $ touch uptime.log
    $ cat uptime.log
    22:33:46 up 6 days, 23:51, 2 users, load average: 1.15, 1.48, 1.57
    

빈 파일을 만드는 다른 방법

:(널 명령어)을 사용하는 방법 외에도 빈 파일을 작성하는 방법이 몇 가지 더 있습니다.
/dev/null을 복사하는 방법이 일반적입니다.

cp /dev/null $uptimelog

또는 /dev/null을 cat해서 출력 리다이렉트 방법도 좋습니다.

cat /dev/null > $uptimelog

/dev/null은 유닉스에서 사용하는 특별한 파일로 내용은 EOF(End Of File)입니다. 따라서 파일로 출력하면 빈 파일이 됩니다.

또는 ture 명령어를 써도 같은 결과가 됩니다.

# uptime.log를 빈 파일로 초기화
true > uptime.log

true 명령어는 :(널 명령어)와 마찬가지로 아무것도 출력하지 않고 종료 스테이터스 0을 돌려줍니다. true 명령어는 외부 명령어이므로 이 예제 같은 경우는 내부 명령어인 :(널 명령어)를 쓰는 편이 좋습니다.