Python으로 프로세스 ID(PID) 관리 및 상태 확인하기
파이썬으로 데스크탑이나 서버 프로그램을 개발할 때, 종종 프로세스 상태를 감시하거나 중복 실행을 방지해야 할 일이 생깁니다.
이때 가장 핵심적인 요소가 바로 프로세스 ID (PID) 입니다. 이번 글에서는 os와 psutil 모듈을 활용하여 다음과 같은 내용을 다뤄봅니다:
- 현재 실행 중인 프로그램의 PID 확인
- 락 파일을 통한 중복 실행 방지
- 저장된 PID가 실제 실행 중인지 확인
- 프로세스 상태 (Zombie, Sleeping 등) 이해 및 종료 가능 여부
1. 현재 프로세스의 PID와 이름 확인하기
파이썬 표준 라이브러리만으로도 현재 프로세스의 PID와 파일 이름을 확인할 수 있습니다.
import os
import sys
pid = os.getpid()
process_name = os.path.basename(sys.argv[0])
print(f"Process Name: {process_name}")
print(f"Process ID (PID): {pid}")
os.getpid()는 현재 실행 중인 프로세스의 ID를 반환하며,
이 값을 활용해 락 파일 생성이나 상태 체크가 가능합니다.
2. 락 파일을 이용한 중복 실행 방지
동일한 프로그램이 두 번 실행되지 않도록 락 파일을 생성하는 방법입니다.
def createLockFile():
global LOCK_FILE_PID
try:
LOCK_FILE_PID = os.getpid()
with open("my_program.lock", "x") as lock_file:
lock_file.write(str(LOCK_FILE_PID))
return True
except FileExistsError:
return False
- "x" 모드는 파일이 존재할 경우 FileExistsError를 발생시켜 중복 실행을 감지합니다.
- 락 파일에는 현재 PID를 기록하여, 나중에 상태 확인도 가능하게 합니다.
3. 락 파일에서 PID 읽어오기
이미 생성된 락 파일에서 PID를 읽어오려면 다음과 같이 합니다:
def readLockFile(lock_file_path):
try:
with open(lock_file_path, "r") as f:
pid_str = f.read().strip()
return int(pid_str) if pid_str.isdigit() else None
except FileNotFoundError:
return None
4. psutil을 통한 PID 상태 확인
psutil 라이브러리를 이용하면 해당 PID가 정상적으로 동작 중인지, 또는 종료되었는지 확인할 수 있습니다.
import psutil
def isProcessRunning(pid):
try:
p = psutil.Process(pid)
p.cpu_percent(interval=0.1) # CPU 사용률을 샘플링하여 존재 여부 확인
return True
except psutil.NoSuchProcess:
return False
이 방법은 is_running()보다 정확한 판단이 가능합니다.
이미 종료된 PID일 경우 예외가 발생하므로, 보다 확실한 존재 여부를 확인할 수 있습니다.
5. 프로세스 상태별 의미와 종료 가능성
상태 이름 | 의미 및 설명 | 종료 가능 여부 |
running | 실행 중, CPU 사용 중 | ✅ 가능 |
sleeping | 대기 중, I/O나 이벤트 응답 대기 상태 | ✅ 가능 |
disk-sleep | 디스크 I/O 응답을 기다리는 상태 | ⚠️ 지연될 수 있음 |
stopped | 사용자나 디버거에 의해 일시 정지된 상태 | ✅ 가능 |
zombie | 이미 종료됐지만 부모가 수거하지 않은 상태 | ❌ 불가능 |
특히 disk-sleep 상태는 커널 I/O에 의해 블로킹되기 때문에 kill -9 명령조차도 바로 반응하지 않을 수 있습니다.
6. os.getpid()로 얻은 PID를 psutil로 사용하는 법
다음처럼 연결해서 사용하면 됩니다:
import os
import psutil
pid = os.getpid()
process = psutil.Process(pid)
print(f"CPU 사용률: {process.cpu_percent(interval=0.1)}")
print(f"프로세스 이름: {process.name()}")
이를 통해 현재 프로세스를 직접 모니터링할 수도 있고, 락 파일의 PID를 읽어 다른 인스턴스 상태를 확인할 수도 있습니다.
마무리
PID 관리는 단순한 시스템 정보 이상의 의미를 가집니다. 다중 실행 방지, 자원 추적, 장애 감지 등 다양한 상황에서 활용할 수 있으며, os, psutil을 함께 사용하면 간단하고 강력하게 구현할 수 있습니다.
'코딩취미 > Python' 카테고리의 다른 글
파이썬 정렬 고급편: 여러 기준 정렬과 내림차순 정렬 쉽게 이해하기 (0) | 2025.04.26 |
---|---|
파이썬 정렬의 핵심! key=lambda 쉽게 이해하고 활용하기 (0) | 2025.04.25 |
PySide6 프로그램 종료 시 반드시 호출되는 함수는 있을까? (0) | 2025.04.21 |
파이썬 Enum 클래스 완벽 정리 – 왜, 어떻게 써야 할까? (0) | 2025.04.10 |
파이썬으로 실무형 로그 시스템 구축하기 – 로그 레벨 분리 + 자동 파일 분할까지 (0) | 2025.04.07 |