파이썬 자동화가 실행된 것 같은데 print와 오류가 보이지 않는다면, 먼저 실행 실패와 출력 경로 문제를 분리해야 합니다. cron에서는 stdout·stderr가 터미널에 그대로 나타난다고 가정하지 말고, 리디렉션과 버퍼링을 순서대로 확인하면 됩니다. 파일이 비어 있다는 사실만으로 작업이 실행되지 않았다고 단정할 수는 없습니다.
1. 먼저 실행 여부와 출력 위치를 나눠 확인하기
수동 터미널에서 보이던 출력이 예약 실행에서 사라지는 경우는 크게 세 갈래입니다.
- 작업 자체가 시작되지 않았습니다.
- 작업은 시작됐지만 stdout 또는 stderr가 다른 전달 경로로 갔습니다.
- 출력이 버퍼에 남아 있어 실행 중에는 파일에 늦게 나타납니다.
따라서 첫 확인은 코드 수정이 아니라 실행 명령과 로그 경로입니다. cron에 등록한 명령이 실제 파일을 가리키는지, 상대경로 대신 의도한 절대경로를 쓰는지 확인합니다. 그다음 표준 출력과 오류 출력이 어디로 향하는지 살펴봅니다.
2. stdout과 stderr는 같은 출력이 아닙니다
print()의 일반 출력은 보통 stdout으로, 처리되지 않은 예외의 traceback은 stderr로 갑니다. Bash 리디렉션에서 >는 stdout을 파일로 보내고 기존 파일을 비우며, >>는 기존 파일 뒤에 추가합니다. 두 스트림을 한 파일에 모으려면 다음처럼 2>&1을 stdout 리디렉션 뒤에 둡니다.
python3 /opt/jobs/report.py >> /var/log/report.log 2>&1
2>&1은 stderr를 그 시점의 stdout 대상에 연결합니다. 그래서 2>&1 >> report.log처럼 순서를 바꾸면 오류가 같은 파일에 들어간다고 보장할 수 없습니다. 운영 로그를 보존해야 한다면 반복 실행마다 기존 내용을 지우는 >보다 >>가 맞는지 먼저 결정합니다.
POSIX crontab 문서에 따르면 stdout과 stderr를 리디렉션하지 않은 cron 출력은 구현에 따라 사용자에게 메일로 전달될 수 있습니다. 즉 “터미널에 안 보인다”와 “출력이 없다”는 같은 말이 아닙니다. 시스템의 cron 메일이나 실행 환경의 별도 로그도 확인해야 합니다.
3. 비대화형 실행에서는 버퍼링을 의심합니다
터미널과 파일은 Python 출력의 버퍼링 조건이 다를 수 있습니다. Python 공식 문서는 대화형 stdout과 비대화형 stdout의 버퍼링 방식이 다르며, -u 또는 PYTHONUNBUFFERED로 표준 스트림을 비버퍼링할 수 있다고 설명합니다.
즉 작업이 오래 실행되고 중간 상태를 바로 기록해야 한다면 다음처럼 실행할 수 있습니다.
python3 -u /opt/jobs/report.py >> /var/log/report.log 2>&1
환경변수로 같은 실행 정책을 줄 수도 있습니다.
PYTHONUNBUFFERED=1 python3 /opt/jobs/report.py >> /var/log/report.log 2>&1
코드 수준의 출력 즉시 기록이 필요하더라도, 그것은 출력 시점을 조정하는 보조 방법이지 cron 명령이 올바른 파일을 실행하는지나 stderr 리디렉션 문제를 해결하는 방법은 아닙니다.
4. 확인 순서는 이렇게 잡습니다
- 실행 명령을 수동으로 같은 사용자와 같은 경로에서 실행합니다.
- cron 명령에 stdout과 stderr 리디렉션을 명시합니다.
>와>>중 로그 보존 목적에 맞는 연산자를 선택합니다.- 장시간 작업에서 기록이 늦으면
-u,PYTHONUNBUFFERED를 적용합니다. - 그래도 파일이 전혀 만들어지지 않으면 실행 권한, 명령 경로, cron 등록 상태를 별도로 확인합니다.
이 순서를 지키면 “실행되지 않음”, “다른 곳으로 전달됨”, “버퍼에 머묾”을 섞어서 판단하는 일을 줄일 수 있습니다. 파일 로그를 남기는 애플리케이션 로깅 설정까지 다뤄야 한다면 파이썬 로그 콘솔·파일 레벨 분리 글에서 다음 판단을 이어갈 수 있습니다.
마무리
파이썬 자동화 로그가 안 보일 때의 핵심은 print를 늘리는 것이 아니라 출력의 목적지를 확인하는 것입니다. 먼저 stdout·stderr를 한 파일에 모으고, 비대화형 실행에서 지연이 확인될 때만 버퍼링 설정을 조정해 보십시오. 로그 파일이 비어 있어도 실행 여부, 전달 경로, 기록 시점을 차례로 확인하면 재실행을 반복하는 일을 피할 수 있습니다.
주요 근거: Python Command line and environment, Python sys 공식 문서, GNU Bash Redirections, POSIX crontab