[OS-011][실무] 정해진 시간에 안전하게 작업 실행하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[OS-011][실무] 정해진 시간에 안전하게 작업 실행하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 91회 작성일 26-09-05 15:34

본문

[이번 수업]
로그 정리나 백업처럼 정해진 시간에 자동 실행하는 일을 배치 작업이라고 합니다. 이번에는 작은 Python 작업을 만든 뒤 macOS·Linux의 cron과 Windows 작업 스케줄러에 등록합니다. 시간만 맞추지 않고 중복 실행, 실패 기록, 시간대, 권한까지 점검합니다.

[선수지식]
터미널에서 Python을 실행하고 파일 경로를 확인하는 법, 프로세스·권한·환경변수의 기초를 알고 있어야 합니다.

[학습목표]
1. cron의 시간 표현과 배치 작업의 실행 환경을 설명한다.
2. 절대 경로와 로그를 사용해 작업을 재현 가능하게 등록한다.
3. 중복 실행과 실패를 고려한 운영 점검표를 만든다.

[핵심개념]
사용자 crontab의 한 줄은 보통 `분 시 일 월 요일 명령`의 다섯 시간 필드로 구성됩니다. `* * * * *`는 매분을 뜻합니다. cron은 해당 사용자의 권한으로 명령을 실행하지만, 대화형 터미널보다 PATH 같은 환경이 단순합니다. 그래서 실행 파일·스크립트·로그 파일은 절대 경로를 쓰는 편이 안전합니다. Windows에서는 작업 스케줄러가 같은 역할을 하며 `schtasks` 명령으로 작업을 만들고 실행할 수 있습니다.

스케줄러는 실행 시점만 결정합니다. 작업 자체는 재실행해도 결과가 망가지지 않는 멱등성, 한 번에 하나만 돌게 하는 잠금, 제한 시간, 재시도, 종료 코드, 로그를 가져야 합니다. 실행 시간이 주기보다 길면 작업이 겹칠 수 있습니다. 컴퓨터가 꺼지거나 잠든 동안 놓친 실행을 cron이 자동 보충한다고 가정하지 마세요. 일광절약시간을 쓰는 지역에서는 같은 현지 시각이 두 번 나타나거나 사라질 수 있어 기준 시간대도 문서화해야 합니다.

[따라하기]
빈 폴더에 job.py를 만듭니다. 이 코드는 스크립트 옆 job.log에 UTC 실행 시각을 한 줄 추가합니다.
```python
from datetime import datetime, timezone
from pathlib import Path

log_path = Path(__file__).with_name("job.log")
now = datetime.now(timezone.utc).isoformat()
with log_path.open("a", encoding="utf-8") as log:
    log.write(f"{now} status=ok\n")
```
먼저 macOS·Linux는 `python3 job.py`, Windows는 `py job.py`로 수동 실행합니다. 예상 결과는 job.log에 `2026-09-05T...+00:00 status=ok` 형태의 한 줄이 생기는 것입니다.

macOS·Linux에서는 `command -v python3`과 `pwd`로 절대 경로를 확인하고 `crontab -e`에 다음 형식으로 등록합니다. 실제 경로로 바꾸고 공백 없는 연습 폴더를 사용하세요.
```text
* * * * * /절대경로/python3 /절대경로/job.py >> /절대경로/runner.log 2>&1
```
`crontab -l`로 저장 내용을 확인하고 2분 뒤 job.log를 봅니다. 실습 후 `crontab -e`에서 방금 추가한 한 줄만 지웁니다.

Windows PowerShell 또는 명령 프롬프트에서는 실제 절대 경로로 바꿔 실행합니다.
```text
schtasks /create /sc minute /mo 1 /tn OS011LocalJob /tr "C:\Python\python.exe C:\os011\job.py"
schtasks /run /tn OS011LocalJob
schtasks /delete /tn OS011LocalJob /f
```
첫 명령은 매분 작업을 만들고, 둘째는 즉시 시험하며, 셋째는 실습 작업만 제거합니다.

[흔한 실수]
터미널에서는 되는데 cron에서 실패한다면 상대 경로, PATH, 현재 작업 폴더를 먼저 확인하세요. 표준 출력과 오류를 버리면 실패 원인을 찾기 어렵습니다. 명령이 성공적으로 시작됐다는 사실과 업무 처리가 끝났다는 사실도 구분해야 합니다. 처리 건수와 마지막 성공 시각을 별도로 기록하세요.

[보안 주의]
관리자 권한이 필요하지 않은 작업에 sudo나 최고 권한 계정을 쓰지 않습니다. 다른 사용자가 수정할 수 있는 스크립트와 폴더를 실행 경로에 두지 말고, 비밀번호·토큰을 crontab이나 명령줄에 직접 넣지 마세요. 로그에도 개인정보와 비밀값을 남기지 않습니다. 연습은 본인 소유의 로컬 환경에서만 하고 등록한 작업은 끝난 뒤 제거합니다.

[직접 해볼 과제]
job.py가 같은 날짜의 기록을 중복 작성하지 않게 바꾸고, 시작·성공·실패와 종료 코드를 runner.log에 남기세요. 일부러 로컬 입력 파일 이름을 틀려 실패를 만들고 로그만으로 원인을 찾은 뒤 원상복구합니다.

[확인문제]
1. `* * * * *`는 어떤 실행 주기를 뜻하나요?
2. 예약 작업에서 실행 파일과 스크립트에 절대 경로를 쓰는 이유는 무엇인가요?
3. 실행 주기보다 작업 시간이 길 때 어떤 문제가 생길 수 있나요?

[다음 학습]
OS-012에서 사용자·권한·네트워크·로그·자동 실행을 묶어 안전한 Linux 서버 실습 환경을 만듭니다.

[공식 참고 자료]
https://pubs.opengroup.org/onlinepubs/9799919799/utilities/crontab.html
https://github.com/cronie-crond/cronie/blob/master/man/crontab.5
https://docs.python.org/3/library/datetime.html
https://docs.python.org/3/library/pathlib.html
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/schtasks-create
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/schtasks-delete

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
1,931
어제
5,103
최대
16,772
전체
772,985
Copyright © 소유하신 도메인. All rights reserved.