본문 바로가기
Programming/Backend

[맥] 자동실행 cron을 대체하는 launchd

by BitSense 2025. 4. 2.

맥북에서 cron을 사용하는 것도 가능하지만, macOS에서는 기본적으로 cron보다 launchd (Launch Agents) 사용이 더 안정적이고 권장됩니다. cron이 동작하지 않는 이유는 macOS에서 cron이 완전히 활성화되어 있지 않거나, 환경변수 설정이 달라서 종종 작동하지 않을 수 있기 때문이에요.

기존 등록 크론탭 (원하는 기능)

# 월-금, 10시, 17시에 동작
0 10,17 * * 1-5 cd /Volumes/Works/Monitoring && PYTHONPATH=/Volumes/Works/Monitoring /Volumes/Works/Monitoring/venv/bin/python -m apps.console.wiki.check_deploy_status >> /var/log/deploy_check.log 2>&1

✅ 추천 방법: launchd를 사용하는 방식

1. 아래와 같은 plist 파일을 생성합니다:

예: ~/Library/LaunchAgents/com.picory.deploycheck.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.picory.deploycheck</string>

    <key>ProgramArguments</key>
    <array>
        <string>/Volumes/Works/Monitoring/venv/bin/python</string>
        <string>-m</string>
        <string>apps.console.wiki.check_deploy_status</string>
    </array>

    <key>WorkingDirectory</key>
    <string>/Volumes/Works/Monitoring</string>

    <key>EnvironmentVariables</key>
    <dict>
        <key>PYTHONPATH</key>
        <string>/Volumes/Works/Monitoring</string>
    </dict>

    <key>StandardOutPath</key>
    <string>/var/log/deploy_check.log</string>
    <key>StandardErrorPath</key>
    <string>/var/log/deploy_check.log</string>

    <!-- 월~금, 10시 및 17시에 실행 -->
    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key><integer>10</integer>
            <key>Minute</key><integer>0</integer>
            <key>Weekday</key><integer>1</integer> <!-- 월요일 -->
        </dict>
        <dict>
            <key>Hour</key><integer>17</integer>
            <key>Minute</key><integer>0</integer>
            <key>Weekday</key><integer>1</integer>
        </dict>
        <!-- 화~금 동일하게 반복 -->
        <dict><key>Hour</key><integer>10</integer><key>Minute</key><integer>0</integer><key>Weekday</key><integer>2</integer></dict>
        <dict><key>Hour</key><integer>17</integer><key>Minute</key><integer>0</integer><key>Weekday</key><integer>2</integer></dict>

        <dict><key>Hour</key><integer>10</integer><key>Minute</key><integer>0</integer><key>Weekday</key><integer>3</integer></dict>
        <dict><key>Hour</key><integer>17</integer><key>Minute</key><integer>0</integer><key>Weekday</key><integer>3</integer></dict>

        <dict><key>Hour</key><integer>10</integer><key>Minute</key><integer>0</integer><key>Weekday</key><integer>4</integer></dict>
        <dict><key>Hour</key><integer>17</integer><key>Minute</key><integer>0</integer><key>Weekday</key><integer>4</integer></dict>

        <dict><key>Hour</key><integer>10</integer><key>Minute</key><integer>0</integer><key>Weekday</key><integer>5</integer></dict>
        <dict><key>Hour</key><integer>17</integer><key>Minute</key><integer>0</integer><key>Weekday</key><integer>5</integer></dict>
    </array>

    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

2. 터미널에서 등록:

launchctl load ~/Library/LaunchAgents/com.picory.deploycheck.plist

3. 확인:

launchctl list | grep picory

 


✅ 또는 cron 방식으로 유지하고 싶다면 확인해야 할 것들

 

1. cron 로그 확인

macOS는 기본적으로 cron 로그를 syslog에 남깁니다.

grep CRON /var/log/system.log

 

2. cron은 로그인 환경 변수 안 따라감

PYTHONPATH 설정이 제대로 안 먹힐 수 있음 → 전체 경로로 스크립트 안에서 sys.path에 직접 추가하는 방식도 추천됨.

 

3. cron 수정안

0 10,17 * * 1-5 cd /Volumes/Works/Monitoring && /Volumes/Works/Monitoring/venv/bin/python -m apps.console.wiki.check_deploy_status >> /Users/yourusername/deploy_check.log 2>&1
  • deploy_check.log 파일을 /var/log 말고 본인 사용자 폴더로 바꾸는 게 권장됨 (권한 문제 없음)
  • yourusername은 본인 맥북 사용자 계정으로 바꾸세요.

 

이상입니다.

반응형