developer tip

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

copycodes 2020. 8. 17. 09:12
반응형

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를 사용하지 않는다는 것을 알고 있지만, 내가 추천하고 싶은 정말 멋진 쉘입니다.


로그인 여부에 관계없이 프로세스가 영원히 실행되어야하는 경우 프로세스를 데몬으로 실행하는 것이 좋습니다.

supervisord 는 모든 프로세스를 데몬 화하는 데 사용할 수있는 탁월한 솔루션입니다. supervisorctl감독자가 실행중인 프로세스를 모니터링하는 데 사용할 수있는 또 다른 제어 유틸리티 가 있습니다.

이 작업을 수행하기 위해 추가 코드를 작성하거나 기존 스크립트를 수정할 필요가 없습니다. 더욱이 장황한 문서는이 프로세스를 훨씬 더 간단하게 만듭니다.

python-daemon에 대해 몇 시간 동안 머리를 긁적 후에 supervisor가 몇 분 만에 나를 위해 일한 솔루션입니다.

이것이 파이썬 데몬을 작동시키는 데 도움이되기를 바랍니다.


Yapdi를 사용할 수도 있습니다 .

기본 사용법 :

import yapdi

daemon = yapdi.Daemon()
retcode = daemon.daemonize()

# This would run in daemon mode; output is not visible
if retcode == yapdi.OPERATION_SUCCESSFUL:
print('Hello Daemon')

참고 URL : https://stackoverflow.com/questions/2975624/how-to-run-a-python-script-in-the-background-even-after-i-logout-ssh

반응형