-
Python: Popen 백그라운드 실행 및 로그 읽기 (linux)컴퓨터/파이썬 2020. 12. 22. 09:22728x90반응형
subprocess
subprocess — Subprocess management — Python 3.9.1 문서
subprocess — Subprocess management Source code: Lib/subprocess.py The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several older modules and
docs.python.org
1. 할 것
popen으로 서버 프로그램을 실행해서 터미널을 닫아도 종료가 안되게 만들고
(이 글에선, Apache Kafka를 실행)
long running 프로세스 실시간으로 로그 읽고, pid를 저장해서 다음에 쉽게 로그 다시 읽기
2. linux 백그라운드 프로세스 실행법
파이썬 스크립트로 서버를 실행하고 터미널을 닫아도 계속 실행되게 만들 것이다.
(PID를 저장해서 종료/불러오게 만듦)
pythonimport 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를 실행시켜놓고, 바로 다른 서버를 실행하는 이미지다.
로그도 원하는 로그만 출력할 수도 있다.
Run Zookeeper에 해당한다. 3. 실시간으로 로그 읽기
위 프로세스 stdout 포인터를 for문으로 readline 하면,
종료될 때까지 출력을 읽는다.
pythonfor line in iter(zKProcess.stdout.readline, b""): # sentinel line = line.decode("utf-8") # 바이너리로 읽힘 print(line) zKProcess.stdout.close() # 종료되면 닫기
하지만, 서버 실행 프로그램이나, 장기적으로 열고 싶은 프로세스는 어떻게 닫아야 할까?
서버 프로그램 같은 경우는 서버에 연결이 됐는지 확인하여 for문을 break 해서 나가면 된다.
아래처럼, 서버에 연결이 됐으면, break 해서 로그를 그만 읽게 만든다.
(백그라운드에서 계속 실행되게 만들 것이므로, process terminate는 안 한다.)
pythonimport 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
참고
Alfex4936/Kafka-Local-CLI
Apache 카프카 local용 CLI (linux)
github.com
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