[오류수정] notice 프로젝트

이진중·2024년 2월 23일

서비스

목록 보기
1/1

notice는 모교의 컴퓨터공학과 공지사항을 읽어와 텔래그램 봇으로 공지하는 간단한 프로젝트입니다.

어느날 공지방에 누군가 서비스 이제 안하는거냐고 물어서 서버가 정상작동하지 않는다는걸 알았습니다. ㅠ...

문제 파악

AWS에 올려둔 서버가 죽은것이었다.. 코드가 단순히 get요청으로 읽어와서 최신날짜의 공지를 텔래그램으로 전달하는것 뿐인데, 왜 죽었을까...

nohup.out을 확인한 결과, 적힌 오류메시지는 "Flood control exceeded" 이었다.

텔래그램 메시지 전송중 Flood control exceeded 오류가 발생해서 적절한 try-catch 문이 없었기 때문에 프로그램이 바로 죽어버렸다.

Flood control exceeded

구글링한 결과 해당 오류는 너무 많은 메시지를 보낸것이 문제였다. 개발할때 탤래그램봇을 자주 사용하는데, 그 중 하나의 봇에서 메시지를 많이 보냈기 때문에 다른 봇들도 전부 죽은것이 었다.

문제 정의

지금 문제는 2가지 이다.

  1. try-catch로 오류가 발생할 수 있는 부분에 적절한 오류 핸들링을 하지 않았다는 것
  2. 모니터링 시스템이 존재하지 않아 오류가 발생했음을 너무 늦게 알게 되었다는 것

문제 해결 (코드수정)

try-catch 추가 전

send(f"🔥제목: {title} \n공지날짜: {date} \n링크: https://cse.inha.ac.kr{link}\n")

try-catch 추가 후

try:
	send(f"🔥제목: {title} \n공지날짜: {date} \n링크: https://cse.inha.ac.kr{link}\n")
except Exception as e:
	print(e)

추가로 모니터링을 하는 파이썬 파일을 만들어서 구동시켰다. main.py에 추가한 것이 아니라 따로 파이썬 파일에 만들어서 안정장치(?)를 추가했다.

# monitering.py
def schedule_next_run():
    # 다음 정각 시간 계산
    now = datetime.now()
    next_run = (now + timedelta(hours=1)).replace(minute=0, second=0, microsecond=0)
    delay = (next_run - now).total_seconds()
    
    # 다음 정각에 read_last_line_of_nohup_and_send 함수 실행 예약
    scheduler.enter(delay, 1, read_last_line_of_nohup_and_send)
    
    # 다음 실행도 예약
    scheduler.enter(delay, 1, schedule_next_run)

0개의 댓글