nohup으로 Flask 백그라운드 실행 및 로그 남기기

2021. 10. 23. 12:03[개발] 지식/Flask

nohup 명령어는 리눅스에서 프로세스를 실행한 터미널의 세션이 끊어져도 계속해서 동작할 수 있게 해주는 리눅스 명령어이다.

터미털 세션이 로그아웃되면, 리눅스는 해당 터미널에서 실행한 프로세스들에게 HUP signal을 전달하여 종료시키는데, 이 HUP signal을 무시하도록 하는 명령어이다.

또한 표준출력을 nohup.out 파일로 redirection 하여, 프로세스가 종료되어도 파일로 로그를 확인할 수 있다. 다만 파일 용량이 커질 수 있기 때문에 이를 관리하는 것이 필요하다.

nohup {프로세스} &

nohup 명령어의 기본적인 사용법이다.

{프로세스}에 실행하고자 하는 프로그램이나 스크립트를 지정한다.

단 스크립트 파일의 경우 권한이 755 이상이어야 한다.

일반적으로 nohup 명령어를 사용할 때는 백그라운드 작업으로 실행하는 경우가 많기 때문에 뒤에 &를 붙여서 백그라운드 실행이라는 것을 명시한다.

nohup.out을 생성하지 않으려면 표준에러를 /dev/null로 재지향(redirection) 한다.

nohup {프로세스} 1>/dev/null 2>&1 &

nohup.out 파일을 생성하지 않으려면 표준출력과 표준에러를 /dev/null 로 재지향 해주면 된다.

1>/dev/null 은 표준 출력을 사용하지 않겠다는 의미이고, 2>&1 은 표준 에러를 표준 출력과 같게 만드는 명령어이다.

Flask 서비스 구동

PYTHONPATH=../.. nohup python -u {app.py} &

제일 앞에 PYTHONPATH는 모듈 경로를 지정하기 위해 작성하였다.

각자 환경에 따라 불필요하다면 빼도 무관하다.

{app.py} 는 flask run 코드가 들어있는 파일이다.

python 명령어 뒤에 -u 옵션이 있는데, 이는 print문이 실시간으로 찍힐 수 있도록 해주는 옵션이다.

-u 옵션이 없다면,

tail -f nohup.out

과 같이 실시간으로 로그를 확인할 때, 바로바로 print문이 찍히지 않는 현상이 발생한다.

버퍼에 쌓아두었다가 일정 시점에 도달하면 한번에 출력을 하기 때문이다.

따라서 이를 방지하고 실시간으로 찍히도록 하려면 버퍼를 사용하지 않겠다는 의미의 -u 옵션을 주어야 한다.

PYTHONPATH=../.. nohup python -u {app.py} > {로그파일명} &

이런 식으로 nohup.out 파일명 또는 경로를 바꿀수도 있다.

아래는 백그라운드 프로그램 관련 명령어이다.

  • jobs : 현재 백그라운드로 돌아가는 프로그램 리스트
  • fg : 백그라운드로 실행되는 프로그램을 포그라운드로 전환
  • & : 프로세스를 백그라운드로 실행

Ref.

https://gracefulprograming.tistory.com/128

https://imsoncod.tistory.com/17

https://blkcoding.blogspot.com/2018/03/nohup.html

<