-
Python: Popen 백그라운드 실행 및 로그 읽기 (linux)컴퓨터/파이썬 2020. 12. 22. 09:22728x90반응형
subprocess
1. 할 것
popen으로 서버 프로그램을 실행해서 터미널을 닫아도 종료가 안되게 만들고
(이 글에선, Apache Kafka를 실행)
long running 프로세스 실시간으로 로그 읽고, pid를 저장해서 다음에 쉽게 로그 다시 읽기
2. linux 백그라운드 프로세스 실행법
파이썬 스크립트로 서버를 실행하고 터미널을 닫아도 계속 실행되게 만들 것이다.
(PID를 저장해서 종료/불러오게 만듦)
import os import subprocess zKProcess = subprocess.Popen( shlex.split( "nohup zookeeper-server-start.sh ./config/zookeeper.properties" ), # nohup과 preexec_fn으로 백그라운드 실행 stdout=subprocess.PIPE, stderr=subprocess.STDOUT, preexec_fn=os.setpgrp, ) print("ZK PID >>>", zKProcess.pid) # 주키퍼 서버 피드
아래는 zookeeper를 실행시켜놓고, 바로 다른 서버를 실행하는 이미지다.
로그도 원하는 로그만 출력할 수도 있다.
3. 실시간으로 로그 읽기
위 프로세스 stdout 포인터를 for문으로 readline 하면,
종료될 때까지 출력을 읽는다.
for line in iter(zKProcess.stdout.readline, b""): # sentinel line = line.decode("utf-8") # 바이너리로 읽힘 print(line) zKProcess.stdout.close() # 종료되면 닫기
하지만, 서버 실행 프로그램이나, 장기적으로 열고 싶은 프로세스는 어떻게 닫아야 할까?
서버 프로그램 같은 경우는 서버에 연결이 됐는지 확인하여 for문을 break 해서 나가면 된다.
아래처럼, 서버에 연결이 됐으면, break 해서 로그를 그만 읽게 만든다.
(백그라운드에서 계속 실행되게 만들 것이므로, process terminate는 안 한다.)
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) for line in iter(zKProcess.stdout.readline, b""): # sentinel line = line.decode("utf-8") print(line) if sock.connect_ex((ZK_IP, int(ZK_PORT))) == 0: # 서버에서 반응이 오면, 로그 닫기 ZK_STATUS = True sock.close() break
참고
728x90'컴퓨터 > 파이썬' 카테고리의 다른 글
Python: 무료 Cloud Flask 서버 만들기 (AWS EC2 + S3) (3) 2020.12.26 Python: Kafka + 대학교 공지 Parser + Slack API + MySQL (0) 2020.12.15 Python rich: Console 출력 색깔, 꾸미기 (0) 2020.12.13