[python] SSH를 로그 아웃 한 후에도 백그라운드에서 Python 스크립트를 실행하는 방법은 무엇입니까?

Python 스크립트가 bgservice.py있고 내가 빌드하는 웹 서비스의 일부이기 때문에 항상 실행되기를 원합니다. SSH를 로그 아웃 한 후에도 계속 실행되도록하려면 어떻게해야합니까?



답변

실행 nohup python bgservice.py &중지 신호를 무시하고 계속 실행되도록 스크립트를 가져옵니다. 출력은 nohup.out.

이상적으로는 supervise(언제) 죽으면 다시 시작할 수 있도록 다음과 같이 스크립트를 실행 하는 것이 좋습니다.


답변

이미 프로세스를 시작했고 프로세스를 종료하고 nohup 상태에서 다시 시작하고 싶지 않다면 백그라운드로 보낸 다음 소유를 취소 할 수 있습니다.

Ctrl+Z (프로세스 중지)

bg (백그라운드에서 프로세스를 다시 시작

disown %1(이것이 작업 # 1이라고 가정 jobs하고 결정 하는 데 사용)


답변

거의 모든 Linux / Unix 시스템에 있어야 하는 GNU 화면 을 사용할 수도 있습니다 .

Ubuntu / Debian을 사용하는 경우 향상된 변형 byobu 도 꽤 좋습니다.


답변

여기에 설명 된대로 Python 스크립트를 적절한 Python 데몬으로 바꾸는 것을 고려할 수 있습니다 .

python-daemon 은 영원히 실행되는 스크립트가 아닌 백그라운드 데몬 프로세스로 Python 스크립트를 실행하는 데 사용할 수있는 좋은 도구입니다. 기존 코드를 약간 수정해야하지만 단순하고 간단합니다.

python-daemon에 문제 가있는 경우 동일한 작업을 수행하는 다른 유틸리티 관리자 가 있지만이 경우 데몬 화를 위한 즉시 사용 가능한 솔루션이므로 코드를 작성 (또는 기존 수정) 할 필요가 없습니다. 프로세스.


답변

당신은 그것을 할 수 있지만 나는 screen을 선호합니다 .


답변

다음은 데코레이터를 사용하는 Python 내부의 간단한 솔루션입니다.

import os, time

def daemon(func):
    def wrapper(*args, **kwargs):
        if os.fork(): return
        func(*args, **kwargs)
        os._exit(os.EX_OK)
    return wrapper

@daemon
def my_func(count=10):
  for i in range(0,count):
     print('parent pid: %d' % os.getppid())
     time.sleep(1)


my_func(count=10)
#still in parent thread
time.sleep(2)
#after 2 seconds the function my_func lives on is own

물론 bgservice.py파일 의 내용 을 my_func.


답변

zsh을의 쉘은 nohup을 실행하는 모든 백그라운드 프로세스를 만들 수있는 옵션이 있습니다.

에서 ~/.zshrc라인을 추가 :

setopt nocheckjobs  #don't warn about bg processes on exit
setopt nohup        #don't kill bg processes on exit

그런 다음 다음과 같은 프로세스를 실행하면됩니다. python bgservice.py &더 이상 nohup 명령을 사용할 필요가 없습니다.

나는 많은 사람들이 zsh를 사용하지 않는다는 것을 알고 있지만, 내가 추천하고 싶은 정말 멋진 쉘입니다.