How to use the crontab command
crontab은 UNIX 기반 시스템에서 시간을 기반으로 작업을 스케줄링하는 도구
주기적으로 실행해야 하는 작업(예: 백업, 로그 분석, 시스템 업데이트 등)을 스케줄링하는 데 사용됩니다.
장점
– 간단하고 쉽게 사용할 수 있음 : crontab의 구문은 간단하며, 사용자가 작업을 쉽게 스케줄링할 수 있습니다.
– 자동화 : 주기적이고 반복적인 작업을 자동으로 실행할 수 있습니다. 이는 시스템 관리자의 작업 부하를 줄이고, 작업의 정확성과 일관성을 향상시킵니다.
– 유연성 : 분, 시간, 일, 월, 요일 등 다양한 시간 단위로 작업을 스케줄링할 수 있습니다.
– 시스템 자원 효율적 사용 : 시스템의 비활동 시간(예: 야간)에 백업, 업데이트 등의 작업을 스케줄링함으로써 시스템 자원을 효율적으로 사용할 수 있습니다.
단점
– 복잡한 스케줄링 제한 : crontab은 분, 시간, 일, 월, 요일 등의 기본적인 시간 단위로만 작업을 스케줄링할 수 있습니다. 이보다 더 복잡한 스케줄링(예: 매월 마지막 날, 매주 두 번째 수요일 등)은 직접 구현해야 합니다.
– 에러 핸들링 미흡 : crontab 스케줄링 작업이 실패하면, 시스템은 기본적으로 메일로 알림을 보냅니다. 그러나 이 메일을 확인하지 않으면 작업 실패를 인지하지 못할 수 있습니다.
– 보안 문제 : crontab에는 사용자 권한에 따라 접근 제한이 없기 때문에, 잘못된 사용이나 악의적인 공격으로 시스템에 문제가 발생할 수 있습니다.
– 실행 환경의 제한 : crontab으로 실행되는 작업은 로그인 쉘의 환경과 다르게 작동할 수 있습니다. 이는 작업 실행 시 예상치 못한 문제를 일으킬 수 있습니다.
crontab을 사용할 때 주의해야 할 몇 가지 사항이 있습니다.
환경 변수 : crontab으로 실행되는 작업은 사용자의 로그인 쉘 환경과 다르게 작동할 수 있습니다. 이는 스크립트 내에서 환경 변수를 사용할 경우 문제를 일으킬 수 있습니다. 따라서 crontab에서 실행되는 스크립트는 가능한 한 독립적으로 작동하도록 만들어야 합니다.
절대 경로 사용 : crontab 작업은 현재 작업 디렉토리를 가정하지 않으므로, 모든 파일과 명령어에 대해 절대 경로를 사용해야 합니다.
에러 핸들링 : crontab 작업이 실패하면 시스템은 기본적으로 메일로 알림을 보냅니다. 그러나 이 메일을 확인하지 않으면 작업 실패를 인지하지 못할 수 있습니다. 따라서 가능하면 스크립트 내에서 에러를 처리하거나, 에러 로그를 생성하는 등의 방법을 사용하는 것이 좋습니다.
보안 : crontab 파일은 중요한 시스템 작업을 포함할 수 있으므로, 이를 보호하고 관리하는 것이 중요합니다. 또한, 비밀번호나 민감한 정보를 crontab 파일이나 스크립트에 직접 적어두는 것은 피해야 합니다.
자원 사용 : crontab 작업은 시스템의 CPU나 메모리 등의 자원을 사용합니다. 따라서, 주기적으로 큰 자원을 사용하는 작업을 스케줄링할 때는 시스템의 다른 작업에 영향을 주지 않도록 주의해야 합니다.
테스트 : crontab으로 스케줄링한 작업은 반드시 테스트해야 합니다. 특히, 예상치 못한 문제를 미리 발견하고 대응하기 위해, 처음에는 짧은 주기로 작업을 스케줄링해 보는 것이 좋습니다.
crontab의 구조는 아래와 같습니다.
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,s>
# | | | | |
# * * * * * user-name command to be executed
간단하게 생각하시면 (분 > 시간 > 일 > 월 > 요일) 순으로 지정을 합니다.
여기서 보셔야 할 부분은 일요일(0) ~ 토요일(6)으로 갑니다. 나머지 부분은 기본적은 달력 개념과 동일 합니다.
crontab 명령어는 다음과 같은 옵션과 함께 사용될 수 있습니다
-l : 현재 사용자의 crontab을 출력합니다.
-e : 현재 사용자의 crontab을 편집합니다.
-r : 현재 사용자의 crontab을 삭제합니다.
-u : 다른 사용자의 crontab을 편집하거나 출력할 때 사용합니다. (관리자 권한 필요)
crontab 작성 시 한줄 쓰기를 해주셔야합니다.
이론은 접어두고 간단하게 응용해보겠습니다.
크론탭 지정은 # crontab -e 을 사용하여 명령어 지정이 가능합니다.
EX : 매일 자정에 /var/log 디렉터리를 압축하는 방법
0 0 * * * tar -zcvf /path/to/backup/log_backup_$(date +\%Y\%m\%d).tar.gz /var/log
매일 자정(0 0 * * *)에 /var/log 디렉토리를 압축(tar -zcvf)하여 지정된 경로(/path/to/backup/)에 ‘log_backup_년월일.tar.gz’ 형식의 파일로 저장
이런식으로 백업도 가능합니다.
EX : 데이터베이스 백업 진행
0 0 * * * mysqldump -u username -p’password’ database_name > /path/to/backup/database_name_$(date +\%Y\%m\%d).sql
매일 자정에 ‘database_name’ 데이터베이스의 백업을 생성
기본적인 명령어가 숙지되어 있으면 crontab도 쉽게 접근이 가능합니다.
스크립트를 활용하여 응용도 가능합니다.
아래의 내용은 스크립트 생성 후 crontab에 적용 후 /var 디렉터리를 백업하는 과정을 담고있습니다.