Server

서버에 예약 업무 시키기 (crontab 설정)

HoodieJun 2021. 4. 8. 18:20

서버에 작업할 스크립트는 써놨는데 매번 직접 실행하기 귀찮습니다. 예를 들어 매주 일요일마다 백업하기, 매일 아침 6시에 업데이트 하기 등 규칙적으로 해줬으면 하는 작업들을 대신 실행시켜주는 프로그램이 있습니다. 바로 crontab인데요. 예약을 해놓으면 그 시간에 맞춰 명령어를 실행시켜줍니다.

1. crontab 이 있는지 확인

which crontab

/usr/bin/crontab 와 비슷한 결과가 나오면 있는 겁니다. 아무것도 안 나오면 설치해주세요.

2. 스크립트 작성

자신이 실행시키고 싶은 스크립트를 작성합니다.
실행하고 싶은 작업이 간단히 명령어 한 줄로 끝나면 바로 예약을 걸어도 괜찮지만 여러 가지라면 스크립트를 작성하면 한 번에 실행시킬 수 있습니다. 저는 서버에 있는 패키지를 업데이트 후 재부팅하는 스크립트를 짜겠습니다.

cat > /home/user/scripts/update.sh << EOF
#!/bin/sh
/usr/bin/apt update
/usr/bin/apt upgrade -y
/usr/sbin/reboot
EOF

라고 입력하시면 update.sh라는 파일 안에 위의 내용이 입력됩니다. update.sh의 경로는 자신의 상황에 맞게 설정하세요.

3. 스크립트 실행 가능하도록 설정

위에서 짠 스크립트를 실행 가능한 파일로 만들겠습니다.

chmod +x /home/user/scripts/update.sh

4. crontab에 예약하기

crontab -e

라고 명령어를 입력하면 

no crontab for cocojun - using an empty one
Select an editor.  To change later, run 'select-editor'.
1. /bin/nano        <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed

라고 안내 문구가 나옵니다. 편한 편집기를 사용해주세요. 저는 vim을 사용하겠습니다. 그래서 2를 입력했습니다.
그럼 #으로 주석 처리된 간단한 사용방법이 나옵니다. 맨 밑줄에 제 스크립트를 예약하겠습니다. i를 눌러 Insert 모드로 바꾼 다음

30 6 * * * /home/user/scripts/update.sh

라고 입력하게 되면 update.sh라는 파일을 매일 6시 30분에 실행시킵니다. 시간 단위를 5개로 설정할 수 있는데요. 공백을 기준으로 나뉘게 됩니다. 그래서 앞에서부터 분 시 (한 달에 몇 번) 달 (한 주에 몇 번)으로 구성됩니다. *로 하면 생략한다는 뜻이고요. 예를 들어서
[30 18 * * 1 명령어]는 명령어를 오후 6시 반에 일주일에 한 번씩 실행한다는 뜻입니다.
[0 5 1 * * 명령어]는 명령어를 오전 5시에 한 달에 한 번 실행한다는 뜻입니다.
지정 시간 말고 몇 분마다 혹은 몇 시간마다 실행시키고 싶을 수도 있겠죠? 그러면 */ 를 이용하면 됩니다.
[*/10 * * * * 명령어]는 명령어를 10분마다 한 번씩 실행합니다.
[* */2 * * * 명령어]는 마찬가지로 명령어를 2시간마다 한 번씩 실행합니다.
정해진 요일에만 실행하도록 예약할 수도 있습니다.
[0 15 * * 1-5]는 명령어를 월, 화, 수, 목, 금, 즉 평일에만 실행합니다. 0이 일요일이고 6이 토요일입니다.
저는 vim을 이용했으므로 ESC 키를 누른 다음 :wq를 치시면 (1번 nano를 사용하신 분들은 ctrl+o -> Enter -> ctrl+x를 눌러주세요.)
crontab: installing new crontab
라며 정상적으로 예약이 됐습니다.

5. 로그 파일 생성

등록은 잘한 것 같은데 작업을 하는지 안 하는지 알 수가 없네요. 그래서 확인할 수 있도록 실행할 때마다 로그파일에 내용을 남기도록 만들겠습니다.

crontab -e

방금 예약 설정한 파일에서 약간 수정하겠습니다.

30 6 * * * /home/user/scripts/update.sh > /home/user/logs/update.log 2>&1

> /home/user/logs/update.log 2>&1 부분을 추가하면 가장 최근에 실행된 내용이 update.log 파일에 기록됩니다.

cronjob을 설정하고 실행하고 로깅하는 과정을 담아봤습니다. 웹 스크래핑이나 백업, 등등 원하시는 대로 컴퓨터에게 일을 맡기고 여유를 가지면 좋을 것 같네요. 감사합니다!