개발자

Crontab 로그(log) 남기는 방법 (feat. 출력 리다이렉션, 2>&1의 의미)

june__kim 2021. 8. 11. 10:03

Crontab 로그(log) 남기는 방법 (feat. 출력 리다이렉션, 2>&1의 의미)

 

 

2021.08.09 - [개발자] - 맥북 작업 스케줄러 (feat. Crontab사용방법, Cron과 Crontab 차이, 파이썬 파일 자동실행)

 

저번 글에서 Crontab을 사용하는 방법에 대해 글을 남겼었다.

 

Crontab을 통해 작업이 일정시간에 알아서 실행되도록 만들고 실험을 해봤는데

이상하게 작동은 되는데 내가 원하는대로 안 나오더라!

 

즉, 뭔가 오류가 있다는 것을 의미하겠지?

 

근데 그 오류를 어떻게 찾아볼 수 있을까를 고민하다가

작업이 실행되면서 출력되는 것들을 로그파일에 남겨봐야겠다는 생각을 했다.

 

log를 남기는 것은 간단하다.

 

# 덮어쓰기
1 0 * * * /usr/local/bin/python3 /Users/Desktop/main.py > /Users/Desktop/test.log 2>&1

# 기존의 test.log에 이어서 쓰기
1 0 * * * /usr/local/bin/python3 /Users/Desktop/main.py >> /Users/Desktop/test.log 2>&1

 

이렇게 "출력 리다이렉션(output redirection)"인 >와 >>를 통해 test.log라는 파일에 기록을 남긴다.

 

이때 ">"는 기존의 test.log를 덮어쓰면서 완전히 새로운 로그로 기록하는 거고

">>"는 기존의 test.log에 이어서 로그를 기록하는 것이다.

 

그리고 저 뒤에 "2>&1" 이라는 것이 있는데, 이게 뭔가하고 찾아보니

우리가 흔히 "0 = stdIn, 1 = stdout, 2 = stderr" 로 파일디스크립터가 지정되어있다고 배우는데

 

이때 "2>&1"의 역할은 stderr를 stdout으로 리다이렉션하는 것이다.

이렇게 말하면 어려우니까, 간단하게 말하면 "표준에러"도 log에 기록하기 위한 것이다.

즉, 2>&1을 넣지 않으면 stdout(표준출력)의 결과만 로그에 기록되고 stderr에 대한 것은 로그에 기록되지 않는다.

 

 

여틍 이렇게 해서 돌려보니 에러가 로그에 기록되더라.

 

 

에러를 보아하니, json file의 경로에 대한 문제였다.

 

내가 Vscode에서 직접 실행할 때는, 실행경로에 json file이 있어서 작동이 잘 되었는데

지금은 스케줄러에 의해 실행되는 거여서 경로를 명확히 지정해주어야했다.

 

 

이것 이외에도

 

한 2, 3일정도 테스트해봤을 때 잘 돌아가던 코드가 어제 갑자기 터지길래

다시 로그를 확인해보며 소스코드를 까보니, 웹페이지의 html소스가 약간 변경되었더라!

 

로그를 통해 에러를 확인하고 출력결과도 확인할 수 있으니 금방 수정할 수 있었다.

 

 

 

(혹시 수정이 필요한 부분이 있으면 댓글로 알려주세요!)

 

-끝-