ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 봇 항상 켜두기(Always-on) nohup, log(python -u, flush)
    환경설정 및 기타 TIP/GoormIDE 2021. 1. 2. 22:15

    <실행> /workspace/Project/main.py

    # nohup python /workspace/Project/main.py &
    //[1] 3507
    //nohup: ignoring input and appending output to 'nohup.out'

    nohup: 터미널 세션이 끊겨도 계속 실행

    &: 백그라운드에서 실행

     

    <종료>

    # ps -ef // pid 확인
    // root        3507    1732  0 19:17 pts/2    00:00:00 python /workspace/project/main.py 
    
    # kill 3507 // 종료. 가이드에는 -TERM 쓰라고 돼있는데 생략하면 디폴트인 15로 정상종료한다 
    // [1]+  Terminated              nohup python /workspace/project/main.py 

    <로그를 찍고 싶은 경우>

    # nohup python /workspace/Project/main.py > logfile.log 2>&1 &

    print 내용이 로그파일로 옮겨진다. 다만 디폴트 실행이 buffered mode여서, 로그가 특정 분량만큼 모여야 옮겨진다.

    -u: 혹시 로그를 실시간으로 보고싶다면 python에 -u 옵션을 주고 실행하면 된다. 혹은 print('print', flush=True)를 써도 된다.

    logging 라이브러리를 사용하면 보다 디테일한 로깅이 가능하다.

    2>&1: 오류를 출력으로 redirection. 상세내용은 이쪽을 참조했다.

     


     

    봇은 여차저차 완성했고, 항상 알림을 받으려면 24시간 해당 스크립트를 돌려야 한다.

    컴퓨터를 계속 켜둘 수가 없어서 구름IDE를 웹서버로 쓰기로 했다.

    *구글링을 하다가 나와 거의 비슷한 조건의 포스팅을 발견했다. 이런 경우가 꽤 있는듯. 구름 공식 답변은 아래 페이지 참조

     

     

    항상 켜두기 기능이 동작하지 않습니다

     

    help.goorm.io

     

     

    컨테이너 항상 켜두기 설정을 하고

    항상 켜두기 기능은 유료다. 한달에 18,000원을 내면 1컨테이너에 대해 이용할 수 있다.

     

    터미널에서 nohup & 커맨드로 실행하면 된다.

     

    로그파일이 필요없다면 > logfile.log 2>&1 부분은 생략해도 된다.

    프로세스아이디는 ps -ef로도 확인이 가능하다.

     

    다만 이대로 실행하면 로그가 실시간으로 추가되지 않아 불편할 수 있다.

    한 줄 단위로 출력하려면 python -u 옵션이 필요하다. python --help를 입력하면 여러 실행옵션을 확인할 수 있다.

    파이썬-백그라운드로-돌릴-때-로그-실시간-보기python-significance-of-u-option 페이지를 참조했다.

     

     

    혹은 print 함수에 flush 옵션을 넣을 수도 있다. 공식문서에서 flush 키워드로 검색하면 확인 가능하다.

     

    Whether output is buffered is usually determined by file, but if the flush keyword argument is true, the stream is forcibly flushed.

    출력 버퍼링 여부는 대부분 파일에 따라서 결정되지만, flush 키워드가 true이면 (중간의 데이터 저장소인 출력 스트림에 모여있는) 데이터가 (파일, 혹은 출력위치에) 쓰여진다.

     

    flush=True 옵션이 python -u 옵션과 어떤 차이가 있나 테스트 해봤다.

    # nohup python -u main.py > logfile_u.log 2>&1 &
    # nohup python main.py > logfile_flush.log 2>&1 &

    main.py

    import time
    while True:
        print("Hello Python")
        time.sleep(1)
        print("Hello Python FLUSH", flush=True)  # 여기가 flush
        time.sleep(1)
    

     

    python -u 에서는 한 줄 단위로 기록되는 반면에

    print(flush=True) 에서는 flush 코드가 실행될 때 기존 분량까지 같이 기록된다.

     

    꼭 한 줄 한 줄 봐야하는 게 아니라면, 중요한 부분에만 flush를 써도 괜찮을 것 같다.

    댓글

Designed by Tistory.