본문 바로가기
Programming/Backend

[python] 중복 프로세스 방지 스크립트 스니핏

by BitSense 2025. 1. 5.

pyinstaller 로 만든 실행파일을 만들게 되면 종종 중복 실행되는 경우가 있습니다.

파이썬에서 중복 프로세스의 동작을 방지하려면 파일 기반의 락이나 OS별로 제공하는 프로세스 락 메커니즘을 사용할 수 있습니다. 예를 들어, fcntl 모듈을 사용하여 파일 락을 구현할 수 있습니다. 다음은 중복 프로세스를 방지하는 간단한 예제입니다:

import fcntl
import sys

def prevent_duplicate_process(lockfile):
    fp = open(lockfile, 'w')
    try:
        # 파일에 락을 설정합니다.
        fcntl.flock(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
        return fp
    except IOError:
        print("Another instance is already running.")
        sys.exit(1)

if __name__ == "__main__":
    lock_file_path = '/tmp/my_process.lock'
    lock_fp = prevent_duplicate_process(lock_file_path)

    # 프로세스의 메인 로직을 여기에 작성합니다.
    try:
        print("Process is running...")
        # 여기에 원하는 코드 추가
    finally:
        # 파일 락 해제
        fcntl.flock(lock_fp, fcntl.LOCK_UN)
        lock_fp.close()​

이 코드는 /tmp/my_process.lock라는 파일에 락을 설정하여 중복 실행을 방지합니다. 다른 인스턴스가 이미 실행 중인 경우, 프로그램은 메시지를 출력하고 종료됩니다. fcntl은 유닉스 계열 운영체제에서 사용 가능합니다.

윈도우에서는 msvcrt 모듈을 이용한 파일 잠금을 고려해볼 수 있습니다.

import os
import sys
import msvcrt

def prevent_duplicate_process(lockfile):
    if os.path.exists(lockfile):
        fp = open(lockfile, 'r+')
    else:
        fp = open(lockfile, 'w')
    
    try:
        # 파일에 락을 설정합니다.
        msvcrt.locking(fp.fileno(), msvcrt.LK_NBLCK, 1)
        return fp
    except IOError:
        print("Another instance is already running.")
        sys.exit(1)

if __name__ == "__main__":
    lock_file_path = 'C:\\path\\to\\your\\lockfile.lock'
    lock_fp = prevent_duplicate_process(lock_file_path)

    # 프로세스의 메인 로직을 여기에 작성합니다.
    try:
        print("Process is running...")
        # 여기에 원하는 코드 추가
    finally:
        # 파일 락 해제
        lock_fp.seek(0)
        msvcrt.locking(lock_fp.fileno(), msvcrt.LK_UNLCK, 1)
        lock_fp.close()
반응형