ERRORS

주식 자동화하다가 나온 WSL + Cron 자동화

진호우 2025. 12. 30. 01:48

1. Slack API 설정

1.1 Slack App 생성

  1. Slack API 웹사이트 접속
  2. Create New App 클릭 → From scratch 선택
  3. App 이름과 워크스페이스 선택

1.2 Bot Token 발급

  1. 좌측 메뉴에서 OAuth & Permissions 선택
  2. Scopes 섹션에서 권한 추가
  3. Install to Workspace 클릭
  4. 생성된 Bot User OAuth Token 복사

1.3 채널 ID 확인

  1. Slack 워크스페이스에서 채널 우클릭 → View channel details
  2. 하단에서 채널 ID 확인

 

2. Python 코드 작성

2.1 필요한 패키지 설치

pip install slack_sdk pytz

 

 

2.2 Slack 클래스 구현

from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
import sys, traceback

class Slack:
    def activate_slack(self, slack_key):
        self.client = WebClient(token=slack_key)

    def post_message(self, message, channel_id=None):
        try:
            response = self.client.chat_postMessage(
                channel=channel_id,
                text=message,
                mrkdwn=False
            )
            return response
        except SlackApiError as e:
            print(f"Slack API 에러 발생: {e.response['error']}", file=sys.stderr)
            traceback.print_exc(file=sys.stderr)
            raise
        except Exception as e:
            print(f"메시지 전송 중 에러 발생: {str(e)}", file=sys.stderr)
            traceback.print_exc(file=sys.stderr)
            raise

 

 

2.3 메인 실행 코드

from datetime import datetime
import pytz

if __name__ == "__main__":
    try:
        utc_now = datetime.now(pytz.UTC)
        kst = pytz.timezone('Asia/Seoul')
        kst_now = utc_now.astimezone(kst)
        print(f"실행 시간 - UTC: {utc_now.strftime('%Y-%m-%d %H:%M:%S %Z')}")
        print(f"실행 시간 - KST: {kst_now.strftime('%Y-%m-%d %H:%M:%S %Z')}")

        slack_key = '실제 토큰으로 변경'
        channel_id = '실제 채널 ID로 변경'

        slack = Slack()
        slack.activate_slack(slack_key)
        test_message = f"슬랙 메시지 자동화 테스트 성공! (실행 시간: {kst_now.strftime('%Y-%m-%d %H:%M:%S KST')})"
        slack.post_message(test_message, channel_id=channel_id)
        print(f"메시지 전송 완료: {test_message}")
    except Exception as e:
        print(f"스크립트 실행 중 에러 발생: {str(e)}", file=sys.stderr)
        traceback.print_exc(file=sys.stderr)
        sys.exit(1)

 

 

 

3. WSL 가상환경 설정

3.1 문제 상황

직접 실행할 때는 작동하지만, cron에서 실행하면 ModuleNotFoundError 발생 → Cron은 시스템 Python만 사용함

 

3.2 해결: 가상환경 생성

# Python 설치
sudo apt update
sudo apt install python3-full

# 가상환경 생성
python3 -m venv ~/.virtualenv/trader
source ~/.virtualenv/trader/bin/activate

# 패키지 설치
pip install --upgrade pip
pip install slack_sdk pytz

# Python 경로 확인
which python3
# 예: /home/username/.virtualenv/trader/bin/python3

 

 

4. Cron 설정 및 시간대 문제 해결

4.1 시간대 확인

timedatectl
sudo timedatectl set-timezone Asia/Seoul

 

 

4.2 Cron 설정 예시

# 매일 오전 1시 15분 실행
15 1 * * * cd /mnt/c/Users/wlsgh/jinho/docs/trading && /home/username/.virtualenv/trader/bin/python3 HantuStock.py >> /mnt/c/Users/wlsgh/jinho/docs/trading/cron.log 2>&1

 

5. 문제 해결 가이드

5.1 ModuleNotFoundError

  • Cron에서 가상환경 Python 사용
  • 패키지 재설치: pip install slack_sdk pytz

5.2 시간대 문제

  • WSL 시간대 확인/설정: timedatectl
  • Cron에 TZ=Asia/Seoul 명시

5.3 Cron 실행 실패

  • Cron 서비스 상태 확인: sudo service cron status
  • 로그 파일 확인: cron.log
  • 수동 실행 테스트

6. 주의사항

  • 컴퓨터와 WSL이 켜져 있어야 함
  • 장기적으로 항상 켜둬야 한다면 클라우드 서버, 라즈베리파이, 서버리스 함수 활용 가능
  • Slack Token은 환경변수나 설정 파일로 관리