리눅스 백그라운드 파이썬 실행 nohup 사용법


파이썬 프로그램을 백그라운드로 돌리는 방법은 다음과 같다.
 python filename.py &

그러나 이 방법은 현재 창을 종료하면 terminate된다는 단점이 있다.
이를 위해 nohup 키워드를 사용할 수 있다.

$ nohup python filename.py &

해당 명령어를 입력하면 로그 파일로 nohup.out이라는 파일에 쌓이게 된다.
문제는 print 문으로 찍었던 내용이 바로 nohup.out에 쌓이는게 아니다. 

즉 시작해서 

$ tail -f nohup.out
명령어를 친다고 하더라도 바로 print문으로 했던 것이 화면에 나오는 것이 아니라는 것이다.
어느 정도 쌓였다가, 한꺼번에 출력하곤 하는데 바로바로 보고 싶다면 이는 옳은 방법이 아니다.

만약 print문을 바로 바로 보고 싶다면 옵션이 있다.
$ nohup python -u filename.py &
위 명령어를 해 주고

tail -f nohup.out 
바로 print 문이 찍히는 것을 볼 수 있다.



$ nohup 실행문 > 로그파일명 &

리다이렉트 옵션을 써서 애초에 nohup.out이라는 파일 자체가 안나오게 할 수도 있고 파일 명도 바꿀 수 있지만
역시 가장 좋은 방법은 logging 모듈을 그냥 갖다 쓰는 것인 것 같다.



리눅스 백그라운드 / 데몬 프로세스 실행


파이썬과 함께 쓸때는 python3 -u 인자로

./[실행파일]이나 그냥 생으로 프로세스를 시작하면
터미널 종료와 함께 프로세스도 같이 종료된다.
& 붙여서 백그라운드로 해도 마찬가지다.

이걸 해결하기 위해 nohup을 쓴다.

nohup로 실행하기 위해서는 실행파일의 권한이 755 이상이여야 한다.
chmod -755 filename.py
nohup [실행파일]
nohup [실행파일] & -> 백그라운드로 실행

ex ) nohup java filename &


종료하려면

ps -ef | grep filename 을 치고
[root@qsh-2015 /home]# ps -ef | grep filename
root      4297  4205  7 14:32 pts/0    00:00:00 java bingo/filename
root      4319  4205  0 14:32 pts/0    00:00:00 grep filename

여기서 root 바로 다음 것이 프로세스 ID다.
kill -9 프로세스 ID ( kill -9 4297 ) 과 같이 치면
백그라운드 프로세스가 종료되고

다시 ps -ef | grep filename 을 치면
[root@delserv /home]# ps -ef | grep filename
root      4319  4205  0 14:32 pts/0    00:00:00 grep filename

이렇게 뜬다.

nohup으로 실행시킨 파일의 출력값을 보려면
nohup을 실행시켰던 위치에서
tail -f nohup.out
치면 출력값이 실시간으로 나온다.



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

#>  top &                << top을 백그라운드로 실행
#>   jobs                   << 백그라운드로 실행되는 프로그램을 확인
[1]+  Stopped                 top
#>   fg %1                 << 백그라운드로 실행되는 top명령을 다시 불러움


nohup /usr/local/java/bin/java -jar Dshop.jar &

nohup -> 터미널에서 로그아웃을 해도 실행시킨 프로그램은 종료되지 않고 계속 돈다.

ps -aux를 치면.. 프로그램이 돌고 있음을 알 수 있다.





* 주의
nohup으로 실행파일을 돌릴 경우 권한이 755 이상이어야 한다.
chmod 755 shell.sh


가끔 ssh 터미널을 종료할 경우 nohup으로 실행중인 프로그램도 종료되는 경우가 있는데
종료 전에 disown 명령어를 통해 해당 프로세스를 ssh세션에서 분리한 다음
로그아웃 하면 계속 돌릴 수 있다.

다음 글 이전 글
2 Comments
  • Unknown
    Unknown 4월 10, 2019

    좋은정보 감사합니다. 좋은글이라 스크랩 해 갑니다.

  • Unknown
    Unknown 10월 11, 2019

    도움이 많이 되었습니다. 감사합니다

댓글 쓰기
comment url