bash script (backup)2021. 6. 28. 12:58

 

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

 

특정한 파일이 현재 전송되고 있는지 판단하기 위한 방법이다. 다수의 파일을 ftp로 받고 있거나 NFS를 통해서 복사하는 상황에서 이 파일들에 대한 작업을 해야 하는데, 전송중인 파일과 전송완료된 파일을 구분하기 위한 것.

파일이 마지막으로 수정된 시간과 현재 시간과의 차이를 확인하여 정해 둔 기준과 비교하면 되겠다. 파일이 마지막으로 수정된 시간은 stat 명령으로 확인한다. 아래의 예시를 보자.

# 마지막으로 수정된 시간, 1970.1.1 0시부터 경과한 시간을 초(second)로 표시

stat -c %Y my_file.txt

 

-c 옵션으로 출력할 항목을 지정하는데, %Y 항목을 사용. stat 명령을 이용하면 그 외에도 파일에 대한 다양한 정보를 확인할 수 있다. 자세한 내용은 man 페이지를 참고하자.

 

man stat

 

현재 시간은 date 명령을 사용하여 출력. 앞의 stat 명령과 동일한 형태로 출력할 수 있다.

 

# 현재 시간, 1970.1.1 0시부터 경과한 시간을 초(second)로 표시

date "+%s"

 

대상 파일이 현재 전송중이라면, 마지막으로 수정된 시간과 현재 시간과의 차이가 근소해야 한다. 별 문제가 없다면 1초 이하일 것이다. 만약 부하가 많이 걸리거나 네트워크 상태가 별로 좋지 않아서 전송이 지연되고 있다면 좀 더 차이가 날 수도 있을 것이다.

 

대강 시간차가 10초 이하면 현재 전송중이라고 판단하고 그 이상이라면 전송이 끝났다고 판단하는 경우의 예시를 보자.

 

# 대상 파일: my_file.txt

target_file=my_file.txt

# 시간차 기준: 10초

diff_limit=10

# 마지막으로 수정한 시간

mod_time=`stat -c %Y $target_file`

# 현재 시간

cur_time=`date "+%s"`

# 시간 차이 계산

diff=`echo "$cur_time - $mod_time" | bc`

# 시간차가 $diff_limit 이하면 전송중이라고 판단

if [ $diff -le $diff_limit ]

  then echo "$target_file: 전송중입니다."

  else echo "$target_file: 전송완료되었습니다."

fi

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2021. 3. 3. 15:37

 

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

 

date 명령을 이용해서 파일을 마지막으로 수정한 날짜와 시간을 확인할 수 있다. -r 옵션을 사용한다. 아래의 예시를 보자.

 

date -r my_file.txt

2014. 07. 03. (목) 16:34:33 KST

 

원하는 항목만 골라내는 등 표시 형식을 바꿀 수도 있다. 아래의 예시를 보자.

 

# 연도만 구하기

date -r my_file.txt "+%Y"

2014

 

# 연도 및 날짜

date -r my_file.txt "+%Y%m%d"

20140703

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 11. 5. 13:20

 

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

 

스크립트로 반복작업을 해야 하는데, A 작업을 일단 완료하고 나서 시간이 X초 이상 흘렀으면 B 작업을 하고 아직 안 지났으면 C 작업을 해야 하는 좀 애매한 상황이 있어서 이걸 처리하려고 생각한 방법이다.

date 명령에서 출력 형식에 %s 옵션을 사용하면 UTC 기준 1970년 1월 1일 00시 00분 00초부터 몇초가 흘렀는지를 표시해 주는데, 이것을 이용했다. 아래의 예시 스크립트를 참고하자.

# 예시: A작업후 10초 이상 흘렀으면 B작업 실행, 아니면 C 작업 실행
start_time=`date "+%s"`
echo "A작업을 수행합니다!"
# A작업 수행
...
stop_time=`date "+%s"`
# 경과한 시간 = 종료시간 - 시작시간
interval=`echo "$stop_time - $start_time" | bc`
if test $interval -ge 10
then echo "10초 이상 경과. B작업을 수행합니다!"
# B작업 수행
...
else echo "아직 10초 안 됐음. C작업을 수행합니다!"
# C작업 수행
...
fi

 

나노초(nanosecond)를 표시하는 %N 옵션을 이용하면 간단한 스톱워치도 구현 가능. 아래의 예시를 참고하자.

#stopwatch.sh
echo "press ENTER to start"
read enter
start_time=`date "+%s.%N"`
echo "press ENTER to stop"
read enter
stop_time=`date "+%s.%N"`
result=`echo "$stop_time - $start_time" | bc`
echo "$result sec"

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 15. 20:28

 

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

파일 생성 시점을 파일명에 넣어서 임시 파일을 만드는 경우다.  

 

shell script에서 임시로 파일을 만들어서 사용해야 할 경우, 파일명이 다른 파일과 겹치지 않게 하기 위해 date를 활용할 수 있다. 현재 시각을 임시 파일의 이름에 넣으면 된다. 

현재 시각을 "연월일_시분초" 형식으로, 예를 들어 2012년 11월 29일 17시 45분 23초를 20121129_174523 이런 식으로 얻어서 파일명에 사용하자. 

date "+%Y%m%d_%H%M%S"

 

아래의 예는 현재 시각을 time_stamp라는 변수에 할당하여 임시 파일명을 my_tmp_file.$time_stamp.tmp로 정하고 여기에 "this is my temp file" 문자열을 저장한 경우이다.

 

time_stamp=`date "+%Y%m%d_%H%M%S"`

tmp_file_name="my_tmp_file.$time_stamp.tmp"

echo "this is my temp file" > "$tmp_file_name"

 

시각이 2012년 11월 29일 17시 45분 23초라면 임시 파일은 my_tmp_file.20121129_174523.tmp가 될 것이다.

 

만약 이런 script를 거의 동시에 여러 개를 실행해야 하는 경우라면, 임시 파일 이름이 겹치지 않기 위해 초 단위보다 더 세밀하게 시각을 얻어야겠다. 이럴 때는 나노초(nanosecond)를 포함시키면 된다. time_stamp 변수의 값이 10억분의 1초 단위로 정해지니까 겹칠 일이 없을 것이다. 아래와 같이 하면 된다.

 

time_stamp=`date "+ %Y%m%d_%H%M%S_%N"`

 

 

Posted by 반달가면

댓글을 달아 주세요

bash script (backup)2020. 10. 15. 20:21

 

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

 

리눅스에서 date 명령에 추가 조건을 주면 오늘 날짜 말고도 갖가지 날짜를 편리하게 구할 수 있구나!

어제
date -d "yesterday"

내일
date -d "tomorrow"

3일후
date -d "+3 days"

4일전
date -d "-4 days"

지난 금요일
date -d "last friday"

다음주 월요일
date -d "next monday"

 

 

Posted by 반달가면

댓글을 달아 주세요