Python 스크립트를 백그라운드에서 실행하는 여러 가지 방법

PHP中文网
풀어 주다: 2017-04-01 15:15:29
원래의
3252명이 탐색했습니다.

python으로 작성된 모니터링 스크립트 test1.py, while True 모드에서 실행, ssh 원격일 때(putty 터미널 사용) 다음 명령을 통해 스크립트를 시작합니다.

코드는 다음과 같습니다.

python test1.py &
로그인 후 복사

이제 스크립트는 정상적으로 실행되고 있으며, ps를 통해 프로세스 번호를 확인할 수 있습니다. 이때 ssh 터미널은 직접 닫힙니다. 종료 명령을 실행했지만 퍼티를 통해 직접) 버튼 실행), 다시 로그인한 후 프로세스가 종료되었음을 확인했습니다.

백그라운드 시작을 통해 문제가 해결되었습니다. 나중에 참고할 수 있도록 여기에 요약하겠습니다.

linux는 백그라운드에서 실행됩니다.

fork를 통해 구현
Linux 환경에서는 c의 데몬 프로세스가 fork를 통해 구현됩니다. Python도 이런 방식으로 구현할 수 있습니다.

코드는 다음과 같습니다.

#!/usr/bin/env python
import time,platform
import os
def funzioneDemo():
    # 这是具体业务函数示例
    fout = open('/tmp/demone.log', 'w')
    while True:
        fout.write(time.ctime()+'\n')
        fout.flush()
        time.sleep(2)
    fout.close()
def createDaemon():
    # fork进程        
    try:
        if os.fork() > 0: os._exit(0)
    except OSError, error:
        print 'fork #1 failed: %d (%s)' % (error.errno, error.strerror)
        os._exit(1)    
    os.chdir('/')
    os.setsid()
    os.umask(0)
    try:
        pid = os.fork()
        if pid > 0:
            print 'Daemon PID %d' % pid
            os._exit(0)
    except OSError, error:
        print 'fork #2 failed: %d (%s)' % (error.errno, error.strerror)
        os._exit(1)
    # 重定向标准IO
    sys.stdout.flush()
    sys.stderr.flush()
    si = file("/dev/null", 'r')
    so = file("/dev/null", 'a+')
    se = file("/dev/null", 'a+', 0)
    os.dup2(si.fileno(), sys.stdin.fileno())
    os.dup2(so.fileno(), sys.stdout.fileno())
    os.dup2(se.fileno(), sys.stderr.fileno())
    # 在子进程中执行代码
    funzioneDemo() # function demo
if name == 'main': 
    if platform.system() == "Linux":
        createDaemon()
    else:
        os._exit(0)
로그인 후 복사

upstart 메소드를 통해 구현됩니다. 🎜>

upstart를 통해 애플리케이션을 시스템 서비스로 캡슐화할 수 있습니다. 전체 예제는 여기에 직접 기록됩니다.

1. 파이썬 스크립트 작성

코드는 다음과 같습니다.

[root@local t27]
# cat test123.py
#!/usr/bin/env python
import os,time
while True :    
print time.time()    
time.sleep(1)
로그인 후 복사


2. upstat구성 파일

코드는 다음과 같습니다.

[root@local t27]
# cat /etc/init/mikeTest.confdescription "My test"author "Mike_Zhang@live.com"
start on runlevel [234]stop on runlevel [0156]
chdir /test/t27exec /test/t27/test123.pyrespawn
로그인 후 복사

3. upstate 다시 로드

코드는 다음과 같습니다.

initctl reload-configuration
로그인 후 복사

4. 서비스 시작

코드는 다음과 같습니다.


[root@local t27]# start mikeTest
mikeTest start/running, process 6635
[root@local t27]# ps aux | grep test123.py
root      6635  0.0  0.0  22448  3716 ?        
Ss   09:55   0:00 python /test/t27/test123.py
root      6677  0.0  0.0 103212   752 pts/1   
 S+   09:56   0:00 grep test123.py
로그인 후 복사


5. 서비스 중지

코드는 다음과 같습니다.

[root@local t27]# stop mikeTest
mikeTest stop/waiting
[root@local t27]# ps aux | grep test123.py
root      6696  0.0  0.0 103212   752 pts/1    S+   09:56   0:00 grep test123.py
[root@local t27]#
로그인 후 복사

달성 bash 스크립트를 통해

1 , Python 코드

코드는 다음과 같습니다.

[root@local test]# cat test123.py#!/usr/bin/env python
import os,time
while True :    print time.time()    time.sleep(1)
로그인 후 복사


2. 시작 스크립트 작성

&를 직접 사용하여 프로세스를 시작하는 경우:

[root@local test]# cat start.sh#! /bin/sh
python test123.py &
로그인 후 복사
코드는 다음과 같습니다.

Ssh 터미널을 직접 닫으면 프로세스가 종료됩니다.


screen, tmux 등을 통해 이루어집니다.

[root@local test]#./start.sh
로그인 후 복사
프로그램을 임시로 실행하고 싶다면 screen, tmux를 통해 프로그램을 시작하면 됩니다. tmux를 시작하는 방법에 대한 설명입니다.


1. tmux 시작

python test123.py &
로그인 후 복사
터미널에 tmux를 입력하여 시작


2. tmux에서 프로그램 시작

다음 명령을 직접 실행하세요(위 스크립트 참조): python test123.py

3. SSH 터미널을 직접 닫습니다(예: Putty의 닫기 버튼). >

4. 다시 SSH 접속 후 다음 명령어를 실행합니다.

코드는 다음과 같습니다.

이제 Python 프로그램이 여전히 존재하는 것을 볼 수 있습니다. 정상적으로 실행해 보세요. 위 내용은 Python 스크립트를 백그라운드에서 실행하는 여러 가지 방법에 대한 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿