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


110

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

답변:


213

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

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


15
nohup 및 &로 명령을 실행하면 nohup: ignoring in put and appending output to nohup.out'` 메시지가 표시 되고 Enter 키를 누르면 프로세스가 상태 1로 종료됩니다. 무슨 일입니까?
Santosh Ghimire

1
nohup.out에서 출력을 읽으십시오. 제 경우에는 권한 문제였습니다. sudo를 사용해야했습니다
mxns

이 메소드에서 실행 된 후 bgservice를 중지하는 방법은 무엇입니까?
구멍에 불

1
@Shaegorath는 나중에 프로세스에 신호를 보낼 수 있도록 pid를 어딘가에 저장합니다. 당신이 somecommand &그것을 한 후에 일부 쉘 (bash, zsh 등) 에서 pid를 인쇄합니다 [1] 12345. 그렇지 않으면 $!.
Tony Beta Lambda

31

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

Ctrl+Z (프로세스 중지)

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

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


17

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

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


12

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

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

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


문제를 어떻게 해결할 수 있는지에 대한 간략한 설명을 제공하는 것은 일반적으로 좋은 생각입니다.
Nikhil Sahu


5

다음은 데코레이터를 사용하는 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.


1
SIGHUP 신호를 잡아야 할 수도 있습니다. 그런 다음 블록에 signal.signal (signal.SIGHUP, handler)를 추가합니다.
Chouettou

3

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


1

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

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

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

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

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


1

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')

1

이 시도:

nohup python -u <your file name>.py >> <your log file>.log &

위의 명령을 화면 에서 실행하고 화면 밖으로 나올 수 있습니다.

이제 다음과 같이 Python 스크립트의 로그를 추적 할 수 있습니다. tail -f <your log file>.log

스크립트를 죽이려면 ps -auxkill 명령을 사용할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.