linux 운영체제로 서비스를 관리하다 보면, “초 단위 크론 실행”을 필요로 할 때가 있다.
하지만 리눅스 운영체제에서는 분단위 실행을 기본으로 한다.
그렇다면 어떻게 하면 초단위 실행이 가능할까?
설명하기에 앞서, 크론에서 별(*) 설정을 가르쳐주는 유용한 사이트가 있다!
참고해볼만한 좋은 사이트 인거같아서 링크걸어둔다.
크론의 경우 위에서 말한 바와 같이 분 단위 실행이 기본이다
$ cronjob -e
* * * * * /byminute.sh;
의 경우 매 분마다 byminute.sh 파일이 실행 된다.
그렇다면 우선 30초마다 실행시키는 크론 스크립트를 만들어보자.
우선, “30 초 단위 크론 실행”을 미리 알아보자
해당 작업을 하려면, 두 가지 방법이 있다. (물론 더 있을 수 있음)
- “. sh” 파일에 시간 단위 추가하기 (실생활엔 많이 안 쓰임)
- 크론탭에 추가하기
하지만 sh 파일을 수정하는 건 실생활에서 크게 쓰이지 않는다. (사실 사용해본 적은 없고, 이론적으로만…..)
따라서, .sh 파일에 시간 단위 추가하는 것은 뒤에 설명하기로 하겠다.(힌트 : .sh 파일에 추가는 while/done sleep 명령으로 실행 가능하다)
$ crontab -e
* * * * * /run_1.sh
* * * * * /run_2.sh
기본적으로 분 단위 실행 크론이 있다고 가정해보자. 이 두 가지는 어떻게 실행될까?
run_1.sh 와 run_2.sh 는 동시에 실행될 것이다. 크론에 저렇게 추가되어 있다고 해서,run_1.sh 가 실행된 뒤 run_2.sh 가 실행되진 않는다. (절때!)
그렇다면 위에 제시된 걸 기준으로,
$ crontab -e
* * * * * /run_1.sh
* * * * * sleep 30; /run_2.sh
이렇게 하면 어떻게 될까?
첫 번째 줄과 두번째 줄은 동시에 실행될 것이다. 하지만 두번째 스크립트는 30초간 슬립한 뒤 run_2.sh 를 실행하게 된다. 결론적으로 보자면?
==> 첫번째 run_1.sh 가 실행된 뒤, 30초 뒤에 run_2.sh 가 실행된다.
run_1.sh 를 30초 간격으로 실행시키고 싶다면,
$ crontab -e
* * * * * /run_1.sh
* * * * * sleep 30; /run_2.sh
그렇다면 , 매 5초간은 어떻게 실행시킬까?
“5 초 단위 크론 실행”
위의 30초 단위를 예 삼아,
$ crontab -e
* * * * * /run.sh
* * * * * sleep 05; /run.sh
* * * * * sleep 10; /run.sh
* * * * * sleep 15; /run.sh
* * * * * sleep 20; /run.sh
* * * * * sleep 25; /run.sh
* * * * * sleep 30; /run.sh
* * * * * sleep 35; /run.sh
* * * * * sleep 40; /run.sh
* * * * * sleep 45; /run.sh
* * * * * sleep 50; /run.sh
* * * * * sleep 55; /run.sh
를 실행하면 매 5초마다 실행되는 크론이 생성된다.
근데 실생활에서 이렇게까지 쓸까…?
“크론을 사용하지 않고 반복 작업”
위에서 sh 파일 수정해서 크론 돌리기이다.
$ vim run.sh
echo "hello world" >> log.log
(log.log 파일에 "hello world" 를 스택킹하는 스크립트)
run.sh 스크립트가 위에 제시된 파일이라고 가정하자. (사실 가정할 것도 없다)
5초마다 반복 작업하기 위해서는, 저 쉘 스크립트 파일을
$ vim run.sh
while true; do
echo "hello world" >> log.log
sleep 5;
done
=============================
$ ./run.sh
으로 while 문에 묶기만 하면 된다.
저렇게 해두면.. ./run.sh 했을 경우.. 저 스크립트는 종료되지 않는 이상.. 5초간 슬립 하고 hello world를 스택킹하고 5초간 슬립하고 hello world 를 스태킹하는 과정을 반복하게 된다.
다시 한번 말하지만.. 이건 관리 이슈가 있어서 크게 실생활에 사용하진 않는다.
뭐.. 사용하는 사람이 있긴 한데, 스크립트 프로세스가 죽어버리면 곤란하니, supervisord와 같은 유틸리티와 같이 사용한다.
//supervisord.org/
조금 기분적인 설명을 덧 붙이자면, Process watcher 같은 역할을 한다.
supervvisord에 프로세스를 입력한 뒤, 프로세스가 죽으면 다시 실행시키도록 하면 된다.