본문 바로가기
코딩취미/Python

Python으로 프로세스 ID(PID) 관리 및 상태 확인하기

by 브링블링 2025. 4. 25.
반응형

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을 함께 사용하면 간단하고 강력하게 구현할 수 있습니다.

반응형