Crontab (Linux)
cron(크론)은 원하는 시간에 명령(프로그램)을 시키기 위한 데몬이다. 서버는 늘 깨어있다는 것을 이용한 최대한의 활용법이 될 수 있다.
- 내가 새벽 3시에 서버에 특정 작업을 해줘야하는데 그 때 깨어있을 수 있는가?
- 또는 30분간격으로 HDD의 사용량을 운영자에게 알리도록 해야한다면?
- 매월 초에 자료를 백업 받고 싶다면?
crontab -l # 현재 crontab에 등록된 작업보기
crontab -e # crontab 편집하기
시간 설정에서 몇가지 의미있는 것들을 알아보자.
- '*'표시는 해당 필드의 모든 시간을 의미한다.
- 3,5,7 와 같이 콤마(,)로 구분하여 여러 시간대를 지정할 수 있다.
- 2-10와 같이 하이픈(-)으로 시간 범위도 지정할 수 있다.
- 2-10/3와 같이 하이픈(-)으로 시간 범위를 슬래쉬(/)로 시간 간격을 지정할 수 있다. (2~10까지 3간격으로. 즉, 3,6,9를 의미함)
분 시 일 월 주 실행할 내용
형식이다.
밑의 예제를 참고하고 원하는 설정 알려주시는 갓양님 사이트 https://crontab.guru/ 를 해보자.
예
매주 토요일 새벽 2:20 20 2 * * 6 명령어
매일 새벽 4시 1분 1 4 * * * 명령어
매월 1일 새벽 1시 15분 15 1 1 * * 명령어
매일 오전 4,5,6시 0 4-6 * * * 명령어
매일 2시간간격으로 5분대에 5 */2 * * * 명령어
1,7월 1일 새벽 0:30 30 0 1 1,7 * 명령어
# save every 3 min */3 * * * * /home/mine/bin/mc1 save
# restart at 11:55am & 11:55pm 55 11,23 * * * /home/mine/bin/mc1 restart
#2개월마다 3일 3시 33분 33 3 3 */2 * /opt/letsencrypt/certbot-auto renew
정기적으로 PHP 실행
52 * * * * wget -p --spider http://openwiki.kr/bb/rssboard.cron.php
매시각 52분에 원격의 php 파일을 실행함.
로그
잘실행되고 있는지 로그를 확인하려면
명령어 뒤에 >> /home/user/crontab.log
우분투 서버버전에서 crontab 사용해보려고 했는데 /var/log 에 crontab 로그파일이 남겨져 있지 않아서 왜 그런지 찾아보니 기본설정이 로그가 남겨지지 않도록 되어있었다. 다음과 같이 로그 관련 데몬 설정 파일을 수정하고 데몬을 재시작 시켜 주면 된다.
sudo vi /etc/syslog.conf
파일 열어서 crontab 찾아서 코멘트 되어 있는 부분 풀어준다.
기타
cron 설정파일 저장위치
cd /var/spool/cron/crontabs
여기 들어가면 각 유저별(유저명) cron 설정파일이 들어있다. 직접 변경하려면 Root 권한 필요.
필요없는 이메일 알림 없애기
명령을 수행하고 나서 결과를 이메일로 보내려는 시도를 하는데, 귀찮다.
각 명령어의 끝에 > /dev/null
를 붙임.
혹은
맨 위에
MAILTO=""
추가
필요없는 syslog
/var/log/syslog
이 파일을 보면 크론이 실행될 때마다 로그가 쌓이는 것을 볼 수 있다. 별 내용도 없고 꼴보기 싫으니 없애보자.
rsyslog
sudo nano /etc/rsyslog.d/50-default.conf
파일을 보면
*.*;auth,authpriv.none -/var/log/syslog
라는 항목이 있는데 이곳에 cron.none 을 추가하면 된다.
*.*;auth,authpriv.none,cron.none -/var/log/syslog
그리고 당연히 디먼 재시작
sudo service rsyslog restart
다른 방법
https://languor.us/cron-pam-unix-cron-session-session-opened-closed-user-root-uid0
Go to the /etc/pam.d directory. Open the file common-session-noninteractive in an editor. Look for the following line: session required pam_unix.so Above this line, add the following: session [success=1 default=ignore] pam_succeed_if.so service in cron quiet use_uid Save the file and exit. Restart crond using something like service cron restart.