Skip to content

zozindev/s_cheduler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

S-cheduler

Windows에서 정해진 시각에 배치 파일, Python 스크립트, PowerShell 스크립트, 실행 파일을 실행하는 가벼운 작업 스케줄러입니다. 작업을 JSON으로 관리하고, GUI에서 실행 상태와 결과를 확인할 수 있습니다.

현재 문서와 코드 기준 버전은 v3.0입니다.

주요 기능

  • 작업별 활성화/비활성화: 작업을 삭제하지 않고 일시 중지합니다.
  • 다음 실행 시각, 최근 실행 시각, 실행 결과를 목록에서 확인합니다.
  • 실행 상세 보기: 종료 코드, 표준 출력, 오류 출력, 실행 시간, 로그 파일 열기를 제공합니다.
  • 작업별 실행 제한 시간: 기본 30분. 제한 시간을 넘기면 프로세스를 종료하고 실행시간 30분 초과 오류로 기록합니다.
  • 설정 백업·복원: 작업 설정을 JSON 파일로 내보내거나 다른 PC에서 복원합니다.
  • 작업 복제: 기존 작업의 경로, 실행 시각, 알림 수신자를 복사해 새 작업을 만듭니다.
  • 하루 단위 다중 작업 스케줄링
  • Windows 절전 방지 및 절전 모드 해제 타이머
  • 작업 성공·실패 결과의 파일 로그 기록

같은 시각에 여러 작업이 있으면 등록된 순서대로 하나씩 실행합니다. 비활성화된 작업은 실행 대상과 절전 타이머에서 제외됩니다.

기술 스택

영역 사용 기술
언어 Python 3.10 이상 권장
GUI CustomTkinter, tkinter 메뉴
프로세스 실행 Python 표준 라이브러리 subprocess
Windows 제어 표준 라이브러리 ctypes와 Win32 API
설정 저장 JSON, 원자적 파일 교체 방식
알림 requests 기반 Teams Webhook, smtplib 기반 SMTP 이메일
환경 변수 python-dotenv
백그라운드 실행 Python threading

Windows 10/11에 맞춰 개발되었습니다. GUI와 전원 제어는 Windows에서 가장 안정적으로 동작합니다.

설치 및 실행

PowerShell에서 프로젝트 폴더로 이동한 뒤 실행합니다.

py -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
python main.py

PowerShell 실행 정책 때문에 가상 환경이 활성화되지 않으면 다음 명령을 한 번 실행한 뒤 다시 시도할 수 있습니다.

Set-ExecutionPolicy -Scope Process Bypass

절전 모드 해제 타이머를 사용하려면 프로그램을 관리자 권한으로 실행하는 것이 좋습니다. Windows 전원 옵션에서 절전 모드 해제 타이머 허용도 활성화되어 있어야 합니다.

알림 설정

알림을 사용하려면 프로젝트 루트의 .env.example.env로 복사하고 필요한 값을 입력합니다.

Copy-Item .env.example .env

Teams는 TEAMS_WEBHOOK_URL, 이메일은 GMAIL_USERGMAIL_APP_PASSWORD를 설정합니다. Gmail은 일반 비밀번호가 아닌 Google 앱 비밀번호를 사용해야 합니다. Teams와 이메일이 모두 설정되어 있으면 Teams를 우선 시도하고 필요할 때 이메일을 사용합니다.

TEAMS_VERIFY_SSL=false는 회사 네트워크의 SSL 검사로 인증서 검증이 실패할 때만 사용합니다. .env에는 비밀번호와 Webhook 주소가 들어갈 수 있으므로 Git에 커밋하지 마십시오.

사용 방법

작업 추가·수정

  1. 화면 오른쪽 위의 + 버튼을 누릅니다.
  2. 작업 이름, HH:MM 형식의 실행 시각, 실행 파일 경로를 입력합니다.
  3. 절전 모드 해제와 수신 이메일을 설정합니다. 새 작업은 예약 실행 활성화 및 30분 제한 시간으로 자동 생성됩니다.
  4. 저장하면 백그라운드 스케줄러가 즉시 새 설정을 읽습니다.

지원 경로는 .bat, .cmd, .exe, .py, .ps1 등입니다. Python 파일은 현재 프로그램을 실행한 Python 인터프리터로 실행하고, PowerShell 파일은 Windows PowerShell로 실행합니다.

작업 관리

  • 작업 카드를 누르면 오른쪽 실행 상세 패널에서 다음 실행, 최근 실행, 결과, 종료 코드, 출력, 오류, 실행 시간, 경로를 확인할 수 있습니다.
  • 작업 카드를 더블클릭하면 작업 수정 창이 열립니다.
  • 목록과 상세 패널 사이의 구분선을 드래그하면 오른쪽 상세 패널의 폭을 조절할 수 있습니다. 긴 작업명이나 파일 경로는 패널 폭에 맞춰 자동으로 줄바꿈됩니다.
  • 카드 오른쪽 스위치는 해당 작업의 예약 실행만 켜거나 끕니다. 작업 정보와 실행 이력은 유지됩니다.
  • 작업을 선택하면 오른쪽 상세 패널의 빨간 [삭제] 버튼으로 삭제할 수 있으며, 삭제 전에 확인 팝업이 표시됩니다.
  • 지금 실행은 예약 시각을 기다리지 않고 선택한 작업을 실행합니다. GUI에서 저장하는 작업의 실행 제한 시간은 30분입니다.
  • 전체 실행 상세는 실행 결과 창과 로그 파일 열기 기능을 제공합니다.
  • 작업 목록 우측 상단에서 정렬 조건과 오름차순/내림차순을 바로 변경할 수 있습니다.
  • 오른쪽 위 메뉴에서 작업 수정, 복제, 예약 재개/중지, 설정 백업·복원, 새로고침, 절전 방지를 사용할 수 있습니다.
  • 메인 화면은 F5 키 또는 ⋯ → 새로고침으로 다시 불러올 수 있습니다.
  • 복제는 선택한 작업을 작업명 (복사본)으로 추가합니다. 실행 이력은 복사하지 않습니다.
  • 설정 복원은 JSON을 선택해 현재 작업 목록을 교체합니다. 복원 전 백업을 권장합니다.

프로그램 창과 Windows 작업 표시줄에는 동일한 S-cheduler 아이콘이 표시됩니다. Windows는 앱 ID를 사용해 작업 표시줄에서 프로그램을 하나의 앱으로 묶습니다.

목록의 다음 실행은 오늘 실행할 수 있으면 오늘 시각으로, 이미 지난 시각이면 내일 시각으로 표시됩니다. 최근 실행은 마지막 실행 시각이며, 아직 실행하지 않은 작업은 -로 표시됩니다.

실행 제한 시간과 결과

GUI에서 새로 저장하는 작업의 제한 시간은 30분으로 고정됩니다. 제한 시간을 넘기면 실행 프로세스를 종료하고 다음 정보로 저장합니다. 기존 JSON에 다른 제한 시간이 있으면 해당 작업을 다시 저장할 때 30분으로 정리됩니다.

  • 상태: Fail
  • 종료 코드: -2
  • 오류: 실행시간 N분 초과: 작업을 종료했습니다.

일반 실패는 프로세스 종료 코드와 표준 오류를 함께 저장합니다. 표준 출력과 오류 출력은 너무 큰 로그가 GUI를 차지하지 않도록 각각 최대 10,000자까지 보관합니다. 전체 실행 로그는 logs/scheduler.log에서 확인할 수 있습니다.

설정 JSON 형식

data/s_cheduler_config.json은 다음과 같은 배열 형식입니다. 기존 v2 설정에 새 필드가 없어도 기본값으로 읽을 수 있습니다.

[
  {
    "task_name": "DailyReport",
    "execution_time": "09:00",
    "file_path": "C:\\work\\daily_report.bat",
    "wakeup_enabled": true,
    "recipients": ["admin@example.com"],
    "enabled": true,
    "timeout_minutes": 30,
    "last_run_status": "Not Started",
    "last_run_time": null,
    "last_run_return_code": null,
    "last_run_output": "",
    "last_run_error": "",
    "last_run_duration_seconds": null
  }
]

프로그램은 설정을 임시 파일에 먼저 저장한 뒤 원본과 교체합니다. 저장 중 프로그램이 종료되어도 기존 JSON이 손상될 가능성을 줄이는 방식입니다.

프로젝트 구조

main.py                    실행 진입점과 백그라운드 스케줄러
src/models/task.py         작업 데이터 모델과 이전 설정 호환
src/utils/config_manager.py JSON 로드·저장·백업·복원
src/core/executor.py       프로세스 실행·출력 수집·제한 시간 처리
src/core/power_manager.py  Windows 절전 방지·웨이크업 타이머
src/utils/notification_manager.py Teams·이메일 알림
src/gui_manager.py         작업 목록과 설정 GUI
data/                      기본 설정 JSON
logs/                      실행 로그
tests/                     단위 테스트

테스트

python -m unittest discover -s tests -v

테스트는 설정 저장, 이전 형식 호환, 활성/비활성 필터, 같은 시각 작업 순서, 실행 결과 저장, 백업·복원, 프로세스 성공·실패·제한 시간 처리를 확인합니다.

문제 해결

  • 작업이 실행되지 않으면 작업이 활성화되어 있는지, 실행 시각이 올바른지, 파일 경로가 실제로 존재하는지 확인합니다.
  • .bat 또는 .cmd 경로에 공백이 있어도 지원하지만, GUI에서 파일 선택으로 정확한 경로를 입력하는 것이 안전합니다.
  • 웨이크업이 동작하지 않으면 관리자 권한과 Windows 전원 옵션의 웨이크 타이머 허용 여부를 확인합니다.
  • 알림 오류가 발생하면 .env의 Teams/SMTP 설정과 logs/scheduler.log를 확인합니다.
  • 프로그램이 실행 중인 동안 설정을 수정하면 스케줄러가 최대 약 2초 안에 변경을 반영합니다.

About

Like Windows Task Scheduler

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages