IT·개발

Shell Script로 Python 자동 실행 + 로그 남기기 (crontab 스케줄링까지 한 번에)

5월 16, 2026 2 min read

오늘 만들 결과물부터 보여드리면, ./job.sh 한 줄이면 Python 스크립트가 실행되고 그 결과가 debuglog.log에 실행 시각과 함께 차곡차곡 쌓입니다. Shell Script 파일 하나와 crontab 등록 한 줄이면 매일 자동으로 돌아가는 환경을 만들 수 있습니다.

이 글은 2021년 초 실무에서 직접 만들었던 스크립트를 기반으로 합니다. 당시 코드 블록에 빠져 있던 셔뱅 라인을 추가하고 crontab 필드 설명을 표로 보완해, 5년 운영 경험을 담아 단계별로 따라 치면서 바로 써볼 수 있게 정리했습니다.


1. Shell Script가 뭔가요

Shell Script는 쉘에서 사용하는 명령어들의 조합을 모아 만든 배치(batch) 파일입니다. 리눅스/유닉스 환경에서 파이프(pipe), 리다이렉션(redirection), 필터(filter) 등으로 명령어들을 연결해 하나의 흐름으로 실행할 수 있습니다. 이 글에서도 실제로 리다이렉션(>>)을 써서 로그 파일에 출력을 쌓는 방식을 직접 경험하게 됩니다. 자주 쓰는 명령어 조합을 스크립트로 묶어두면 복잡한 작업을 단일 명령으로 실행할 수 있게 됩니다.

스크립트는 인터프리터(interpreter)에 의해 해석·실행되는 프로그램입니다. 인터프리터 스크립트의 종류는 다양하지만, 이 글에서는 가장 범용적으로 쓰이는 Bash 쉘 스크립트를 사용합니다. 쉘에는 본(Bourne) 쉘, C 쉘, Bash 등 여러 종류가 있는데, 그중 Bash가 리눅스 환경에서 가장 널리 쓰입니다.


2. job.sh 파일 만들기

먼저 Shell Script 파일을 하나 만들겠습니다. 터미널에서 다음과 같이 입력합니다.

vi job.sh

vi에서는 i 키로 입력 모드로 진입한 뒤 내용을 작성하고, :wq를 입력해 저장·종료합니다. vi가 낯설다면 nano가 편합니다. nano는 작성 후 Ctrl+X → Y → Enter로 저장합니다. 파일 이름은 job.sh로 맞춰주세요. .sh는 Shell Script 파일임을 나타내는 확장자입니다.


3. Shebang과 핵심 코드 작성

이 스크립트는 Python 스크립트를 실행하고, 실행 시각과 출력 결과를 debuglog.log에 순서대로 기록합니다. job.sh 파일을 열었으면 아래 내용을 그대로 입력합니다.

본 글의 코드는 Python 3.6 이상 환경을 기준으로 작성되었습니다.

#!/bin/bash

# Python 파일이 있는 디렉토리로 이동
cd /0.python/naver/  # ← 본인의 Python 스크립트 경로로 변경하세요

# 로그 파일에 빈 줄 추가
echo "" >> debuglog.log

# 현재 날짜와 시간을 로그 파일에 기록
date +%Y-%m-%d_%T >> debuglog.log

# 실행 시작 메시지 기록
echo "***** Start *****" >> debuglog.log

# Python 스크립트 실행 및 출력 결과를 로그 파일에 추가
python3 main.py >> debuglog.log

# 실행 종료 메시지 기록
echo "***** End *****" >> debuglog.log
job.sh 스크립트 파일 작성 화면

줄 단위로 살펴보면:

  1. #!/bin/bash — 셔뱅(Shebang) 라인입니다. “이 파일은 Bash로 실행해주세요”라고 운영체제에 알리는 첫 줄입니다. 없으면 실행 환경에 따라 동작이 달라질 수 있어서 첫 줄에 반드시 둡니다.
  2. cd /0.python/naver/ — Python 스크립트가 있는 디렉토리로 이동합니다. ← 이 경로는 작가의 환경 기준입니다. 독자 본인의 Python 스크립트가 있는 경로로 바꿔주세요.
  3. echo "" >> debuglog.log — 로그 파일에 빈 줄을 추가해 실행 묶음 사이 구분을 줍니다. >>는 기존 파일 내용 뒤에 덧붙이는(append) 리다이렉션입니다.
  4. date +%Y-%m-%d_%T >> debuglog.log — 실행 시각을 YYYY-MM-DD_HH:MM:SS 형식으로 로그 파일에 기록합니다.
  5. echo "<strong><em></strong> Start <strong></em></strong>" >> debuglog.log — 실행 시작을 알리는 구분선을 남깁니다.
  6. python3 main.py >> debuglog.log — Python 스크립트를 실행하고 표준 출력을 로그 파일에 추가합니다.
  7. echo "<strong><em></strong> End <strong></em></strong>" >> debuglog.log — 실행 종료 구분선을 남깁니다.

표준 에러까지 같이 남기고 싶다면 마지막 실행 줄을 python3 main.py >> debuglog.log 2>&1 처럼 쓰면 됩니다. 이 글의 원본 코드는 단순화를 위해 표준 출력만 다룹니다.


4. chmod로 실행 권한 부여 & 테스트

Shell Script 파일은 처음에 실행 권한이 없습니다. 아래 명령으로 실행 권한을 부여합니다.

chmod +x job.sh

권한을 주고 나면 바로 실행할 수 있습니다.

./job.sh

실행 후 debuglog.log를 열어보면 아래와 같은 형태로 기록되어 있습니다.

2023-03-12_14:28:45
***** Start *****
크롤링 완료: 5건
***** End *****

이 자리엔 main.pyprint로 출력한 내용이 그대로 들어갑니다. 날짜는 실행 시점에 자동으로 채워집니다. 위 예시는 원본 캡처 시점 기준이라 2023년으로 보이는 것입니다.

debuglog.log에 Python 스크립트 실행 결과와 타임스탬프가 기록된 화면

5. crontab으로 스케줄링 설정

매일 오전 9시에 자동 실행하려면 crontab에 등록합니다. crontab -e를 입력하면 에디터(vi 등)가 열립니다. 아래 한 줄을 추가한 뒤, 2단계에서 설명한 방법으로 저장·종료하세요.

# 매일 오전 9시에 job.sh 실행
0 9 * * * /path/to/job.sh

/path/to/job.sh 자리에는 job.sh의 실제 절대 경로를 입력합니다. 경로를 모르겠다면 job.sh가 있는 폴더에서 pwd를 입력하면 절대 경로가 출력됩니다.

crontab 표현식은 앞에서부터 5개 필드로 구성됩니다.

위치필드가능 값
10~59
20~23
31~31
41~12
5요일0~7 (0과 7 모두 일요일)

<em>는 “모든 값”을 의미합니다. 그래서 0 9 </em> <em> </em>는 분=0, 시=9, 나머지 일·월·요일은 모두 *매일 오전 9시 정각이 됩니다.


6. 종료코드로 에러 처리하기

Python 스크립트 실행이 실패했을 때도 로그에 남기고 싶다면, 종료 코드를 체크하는 조건문을 붙입니다. 앞서 작성한 job.shpython3 main.py >> debuglog.log 줄을 아래 두 줄로 교체합니다.

python3 main.py >> debuglog.log
if [ $? -ne 0 ]; then
    echo "Error occurred during execution!" >> debuglog.log
fi

$?는 직전에 실행한 명령의 종료 코드(exit code)입니다. 정상 종료면 0, 오류가 발생했다면 0이 아닌 값이 담깁니다. -ne 0은 “0이 아니면”이라는 조건이므로, Python 스크립트가 에러로 종료됐을 때만 에러 메시지를 로그에 추가합니다.

교체가 완료된 job.sh의 전체 모습은 다음과 같습니다.

#!/bin/bash

cd /0.python/naver/  # ← 본인의 Python 스크립트 경로로 변경하세요

echo "" >> debuglog.log
date +%Y-%m-%d_%T >> debuglog.log
echo "***** Start *****" >> debuglog.log

python3 main.py >> debuglog.log
if [ $? -ne 0 ]; then
    echo "Error occurred during execution!" >> debuglog.log
fi

echo "***** End *****" >> debuglog.log

7. 지금이라면 추가로 챙길 것 — 2026년 시점 회고

[이 단락은 2021년 원본 코드가 아닌, 2026년 현재 시점의 개인적 추가 관찰입니다.]

2021년에 만든 스크립트는 지금도 잘 돌아갑니다. 그 사실 자체가 Shell Script의 강점이기도 합니다. 다만 지금 새로 세팅한다면 두 가지를 함께 들여다볼 것 같습니다.

하나는 로그 로테이션. debuglog.log가 계속 쌓이면 파일이 커져서 관리가 번거로워집니다. 리눅스 환경에서 logrotate라는 도구를 활용하면 로그 파일을 일정 주기로 분리하거나 교체하는 설정을 넣을 수 있습니다. 2021년 당시엔 스크립트를 일단 돌아가게 만드는 게 우선이었고, 장기 운영을 전제할 상황도 아니었기에 언급만 해두고 넘어갔던 항목입니다.

다른 하나는 systemd timer. cron으로도 충분하지만, 최근 리눅스 환경에서는 systemd timer도 스케줄러 후보로 함께 거론됩니다. “cron 대신”이라기보다 “환경에 따라 후보가 있다”는 정도로 알아두면 됩니다.


마치며

로그 없이는 무슨 일이 일어났는지 파악하기 어렵습니다. 자동으로 실행되는 스크립트일수록 로그가 든든한 안전망이 됩니다. 위 코드는 복사해서 바로 써볼 수 있도록 단계별로 정리했습니다. crontab까지 연결해두면 한 번 설정으로 매일 알아서 돌아갑니다.


참고 자료