리눅스에서 일정 주기별로 반복된 일을 하는 방법은 무엇일까요? 예를 들어, 하루마다 투데이를 초기화 한다던지. 이럴 때 쓸 수 있는 것이 crontab입니다.

 


 대략적인 옵션들을 보면 크게 어려운 것은 없슶니다. -l은 current crontab을 출력합니다. -e는 적용되어 있는 crontab을 editor를 이용해서 편집할 수 있게 해 줍니다.

 

 cron.py입니다. output.log에 계속 서버의 현재 날짜와 시간을 표시해 줍니다.

 

 crontab -e를 입력하시면 크론탭을 편집할 수 있는 에디터가 하나 나오는데요.

 

 

 요래 입력하면, 매 분마다 python3 cron.py를 실행시키겠다는 의미입니다. 공백으로 구분된 이 5개의 필드들은 이 사이트를 보면 손쉽게 작성할 수 있으니 참고하면 좋겠습니다. 매 0분마다 돌리는 것은 0 * * * *, 자정마다 돌리는 것은 0 0 * * *이니 참고하셔도 좋겠습니다. 이 둘은 상당히 많이 쓰일 것이니 외워되도 나쁘지 않을 듯 합니다.

 

 

 output.log를 보면 위와 같이 출력되었음을 알 수 있어요.

 


 이제 루트 사용자로 crontab을 등록해 봅시다.

 

 

 /home/cho 안에 cron2.py가 있습니다. 이 파일은 output2.log 파일에 계속 서버의 현재 날짜와 시간을 씁니다.

 

 

 crontab에 cron2.py를 매 분마다 실행시키겠다는 것을 등록합니다.

 

 

 저는 cho 폴더 안에 output2.log에 뭔가 쌓일 거라 기대를 했습니다. 그런데, 그러지 않았습니다. 뭐가 문제일까요? 다시 루트로 로그인 해 보겠습니다.

 


 에러를 error.log로 출력하려면, command 뒤에 2>error.log를 입력해 줍니다. 이는 에러는 error.log로 떨어트린다는 의미입니다. 1분 정도 지나고 어딘가에 있는 error.log를 보면 아래와 같은 메세지를 볼 수 있습니다.

 

 

 그랬더니, cron.py를 열 수 없다는 메세지가 뜨는 것입니다. 결국, root의 cron이 인식하는 path에 cron2.py가 없어서 에러가 뜬 셈인데요. 어떻게 하면 될까요? 단지, cron2.py가 있는 절대 경로를 입력해 주면 됩니다. 사실, 그게 속 편한 방법입니다.

 

 

 cron2.py 대신에 /home/cho/cron2.py를 입력해 주었는데요. 절대 경로를 입력해 주었다는 것을 주목하시면 됩니다. 그리고 나서, 다시 실행을 시켜 보면, /home/cho에 있는 output2.log에는 아무 로그도 쌓이지 않습니다. 대신에 /home/root로 가 보면 뜬금없는 output2.log가 있는 것을 볼 수 있을 텐데요.

 

 

 이 파일 안에 있는 내용을 출력해 보면, 1분마다 로그가 쌓이는 것을 볼 수 있습니다. 제가 예상했던 /home/cho 안에 있는 로그 파일인 output2.log에 출력되지 않았습니다. 만약에 해당 파일에 출력하게 하려면, 그냥 절대 경로 /home/cho/output2.log 로 주시면 됩니다. script 파일 내에 파일을 read 하는 로직이 있는 경우에 조심해야 합니다. read 모드로 읽는 경우에, 파일이 없다면 error를 떨어트리는 경우가 있기 때문입니다. 그냥 속 편하게 절대 경로로 주시는 게 편하겠습니다.