관련지식
linux, crontab, grep

리눅스 터미널에서 crontab -e 를 하면 텍스트 편집기로 crontab에 등록된 작업을 추가/변경/삭제할수 있지만, 만약 쉘이나 프로그램에서 크론탭을 자동으로 수정하고 싶다면 어떻게 해야 할까요?

설정 추가

아래와 같이 크론탭 설정이 저장된 파일을 직접 수정할수 있습니다.(경로는 조금씩 다를수 있음) 그러나 이 방법은 설정 내역만 수정될 뿐, 이미 실행중인 crontab 엔 반영이 안되기 때문에 서비스를 재기동해야만 적용됩니다.

아래 명령어는 crontab에 새로운 설정을 추가합니다.

  1. echo '02 16 * * 1-6 touch /root/a' >> /var/spool/cron/crontabs/root
  2. service cron restart

아래 방법은 crontab 명령어와 stdout을 적절히 조합한 방법입니다. cron 재기동이 필요하지 않습니다.

  1. { crontab -l & echo '02 16 * * 1-6 touch /root/a'; } | crontab -

만약 기존 설정을 무시한채 새로운 설정을 하고 싶다면 아래와 같이 할수 있습니다.

  1. echo '02 16 * * 1-6 touch /root/a' | crontab -

기존 설정을 무시한채 다수의 작업을 추가하고 싶다면, 설정할 내역을 파일로 만들어두고 등록할수 있습니다.

예를들어 아래와 같은 내용을 가진 new_job.txt가 있다고 가정합니다.

  1. 00 13 * * 1-6 touch /root/b
  2. 00 15 * * 1-6 touch /root/c

아래와 같이 명령어를 실행하면 new_job.txt 의 내용이 crontab 작업에 overwrite 됩니다. 이 방법은 다수의 작업을 추가할때 유용합니다.

  1. crontab new_job.txt

만약 기존 설정을 유지하면서 다수의 작업을 추가하고 싶다면 아래와 같이 하시면 됩니다.

  1. { crontab -l & cat new_job.txt; } | crontab -

설정 삭제

grep을 이용하여 특정 설정을 삭제할 수 있습니다. 아래 명령어는 ‘touch /root/a’ 작업을 크론탭에서 삭제합니다.

  1. crontab -l | grep -v 'touch /root/a' | crontab -

물론 crontab 설정파일을 직접 수정한후 서비스를 재기동해도 됩니다.

설정 수정

sed 를 이용하여 기존에 설정된 내용을 수정할 수 있습니다. 아래 내용은 위에서 추가한 설정에서 /root/a를 /root/newfile 로 변경합니다. 정규표현식을 필요로 하기 때문에 정규표현식이 익숙하지 않거나 정규표현식으로 처리하기 힘든 상황이라면 전체 설정 다시 하는것도 좋은 방법입니다.

  1. crontab -l | sed 's/\/root\/a/\/root\/newfile/g' | crontab -