bash script2023. 8. 22. 19:31

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/604719

확실치는 않은데, 어쨌든 일단 정리해 두기로. 일단 상황은 아래와 같다.

~/ftp_data 디렉토리에 파일을 받고 있다. 다른 장비에서 자동으로 보내준다. 그리고 1시간 간격으로 이 디렉토리에 있는 파일의 목록을 확인해서 조건에 맞는 파일은 다른 디렉토리로 옮겨야 한다.

별로 복잡하지 않은 문제라고 생각해서 아래와 같이 스크립트를 만들었다. mktemp 명령으로 /dev/shm 디렉토리에 임시 디렉토리를 만들고, find 명령으로 ~/ftp_data 디렉토리에 있는 파일 목록을 출력하여 임시 디렉토리에 파일로 저장. 이후 while 반복문으로 이 파일을 읽어서 하나씩 작업. (mktemp 관련 내용은 여기로, 파일의 내용을 한줄씩 while 반복문에 적용하는 방식에 대한 내용은 여기로)

 

# 임시 디렉토리를 만들고 디렉토리 이름을 변수 tmp_dir에 할당
tmp_dir=`mktemp -d /dev/shm/my_tmp_dir_XXXX`
# 무한반복
while [[ 1 ]]
do
  # ~/ftp_data의 파일 목록을 임시 디렉토리에 file_list.txt로 저장
  find ~/ftp_data -type f > $tmp_dir/file_list.txt
  # 파일 목록을 한줄씩 읽어서 작업
  while read -r filename
  do
    # 파일에 대한 작업
    ...
  done < $tmp_dir/file_list.txt
  # 1시간(3600초) 기다림
  sleep 3600
done

그런데 아주 가끔씩, 파일이 빠지는 경우가 발생했다. 조건에 맞아서 옮겨져야 할 파일이 어쩌다가 한두개씩 그대로 남아 있다. 스크립트에서 뭔가 오류가 있나 싶어서 여러번 살펴 보았지만 알 수가 없었다. -_-;

그러던 중에, 혹시 ftp 파일 전송과 find 명령 실행 사이에 뭔가가 꼬여서 출력값이 뭔가 제대로 나오지 않는 것 아닌가 하는 의심이 들어서 메모리와 디스크를 동기화시키는 sync 명령을 find 명령 바로 앞에 추가해 보았다.

...
while [[ 1 ]]
do
  # sync 추가
  sync
  # ~/ftp_data의 파일 목록을 임시 디렉토리에 file_list.txt로 저장
  find ~/ftp_data -type f > $tmp_dir/file_list.txt
...

이렇게 해 놓고 보니 괜찮아진 듯하다. 아마 대부분의 경우에는 이런 문제가 없을 듯한데 수많은 작은 파일들이 한꺼번에 계속 ftp 전송되는 상황이라 sync가 있어야 되는 것 아닌가 싶다.

 

728x90
Posted by 반달가면