내가 한 노력들

[ Linux ] Shell Script(4) and Cron(scheduler) 본문

IT 공부/Linux

[ Linux ] Shell Script(4) and Cron(scheduler)

JONGI-N CHOI 2021. 6. 4. 16:46

 

 

 

저번시간에 했던 IFS와 awk를 응용

`ls -al(ll)`의 결과를 loop로 출력하는데, 각 파일의 크기의 총합을 계산하고, 새로운 파일을 만들어서 내용을 저장한다.

#!/bin/bash
PRE_IFS=$IFS
TOT=0
IFS="
"
user=`whoami`
FileName="bin_files.txt"
cd /home/${user}
touch $FileName 

for i in `ls -al`; do
  S=`echo $i | awk '{print $5}'` 
  F=`echo $i | awk '{print $9}'` 
  
  if [ "$F" == "." ] || [ "$F" == ".." ] || [ "$F" == "" ]; then 
  	continue 
  fi 
  
  TOT=`expr $TOT + $S` 
  echo "$S $F" >> $FileName 
done
  
echo "Total size is $TOT" 
  
IFS=$PRE_IFS

 

touch 는 새로운 파일을 만드는명렁어

 

파일을 만들기전에 cd를 사용하는 이유는???

현재의 폴더에 파일을 만들고 싶은데, 위의 파일의 실행은 다른 곳에서도 실행이 가능하니까 cd를 설정하지 않으면 실행한 곳에서 파일이 생겨버리기 때문이다. ( home디렉토리 밖에서 실행하면 root가 아니면 권한이 없기 때문에 파일 생성이 불가능 permission 에러 )

 

 

user=`whoami` 
cd /home/${user}

 

그래서 cd 를 지정해줌으로써

현재 로그인된 계정의 디렉토리를 지정해준 것이다.

 

 

 

 

Cron 이란??

Linux에서 사용하는 스케줄러다.

 

스케줄러란??

정해진 시간마다 실행하도록 도와주는 것

예를 들어서, 매월 정해진 시간마다 파일을 백업하라는 명령을 실행시키고 싶을 경우 스케줄러를 이용한다.

 

설치

# apt-get install cron

 

데몬실행

# service cron restart

 

 

 

cron start 확인

# crontab -l

 

 

 

아직 cron을 설정하지 않았기 때문에, 아무것도 나오지 않는다.

 

스케줄로 실행할 파일 만들기

/test.sh

#!/bin/bash
DATE=`date +%H:%M:%S`
echo "$DATE aaaaaaaaaaaaaaaaa"

 

실행되는 시간과 내용을 출력하도록

 

 

crontab 설정

# crontab -e

 

 

위의 명령어를 입력하면 이러한 주석과 함께 아래에 스케줄을 입력할 수 있게 된다.

* * * * * # 분 시 일 월 주

 

start시키고 싶은 일정을 설정할 수 가 있는데,

 

예를 들어서, 매일매일 오후 3시 30분에 실행시키고 싶다.

30 15 * * * #매일매일 오후 3시 30분에 실행

 

매년 12월 5일에 실행시켜라

* * 5 12 * #매년 12월 5일에 실행

1주를 간격으로 오전 3시에 실행시켜라

* 4 * * 1 # 1주를 간격으로 오전 3시에 실행

 

위와 같이 설정을 할 수 가 있다.

 

 

주기 설정다음에는 어떤 파일을 실행시킬지 무슨작업을 할지를 설정한다

* * * * * /test.sh >> /temp.log 2>&1

/ 위치의 test.sh 파일을 실행해서

/ 위치에 temp.log 파일을 생성해서 실행결과를 저장한다.

 

2>&1가 의미하는 것

2는 Standard Error

1은 Standard Out

test.sh의 정상적인 출력 결과가 standard out이고 에러가 발생했을 때에는 standard error로 출력이 된다.

하지만 아무런 설정을 하지 않으면 error의 내용을 볼 수 없기 때문에, 2>&1로 standard error의 내용을 standard out에 포함시켜서 로그파일에 저장시키라는 의미다.

 

 

이렇게 저장을 하고

# crontab -l

 

실행중인 crontab을 확인해보면

방금 설정한 내용이 정상적으로 출력되는 것을 확인할 수 있다.

 

그러면 이제 매 분마다 temp.log파일에 test.sh의 실행결과가 저장이 되는 것을 확인 가능

 

 

매분마다 실행되도록 설정해 놨기 때문에 매분 1초에 실행결과를 저장하는 것을 확인할 수 있다.

 

 

 

 

참고문헌

https://www.youtube.com/watch?v=035pZp2R50M&list=PLEOnZ6GeucBVj0V5JFQx_6XBbZrrynzMh&index=16&ab_channel=%EC%8B%9C%EB%8B%88%EC%96%B4%EC%BD%94%EB%94%A9indiflex