fcntl 삭제 동작

fcntl 삭제 동작

스크립트가 주어진 매개변수를 사용하여 한 번만 실행되도록 fcntl을 통해 잠금을 생성해야 합니다. 이를 달성하기 위해 주어진 매개변수를 사용하여 파일을 생성하고 해당 파일에 대한 잠금을 획득합니다. Python으로 다음 코드를 작성했습니다. 일을 단순하게 유지하기 위해 파일 이름을 "mylockfile"로 하드코딩했습니다.

import traceback
from errno import EACCES, EAGAIN
from fcntl import lockf, LOCK_EX, LOCK_NB
from time import sleep

import os

if __name__ == '__main__':
   # Create lock file and write current pid into it
   fd = open("mylockfile", 'w')
   fd.write("%d " %os.getpid())
   try:
        x = lockf(fd, LOCK_EX | LOCK_NB)
        print("Obtained lock")
        # Do useful work
        sleep(10)

    except OSError as e:
        # Terminate in case of error

        if e.errno in (EACCES, EAGAIN):
            print("Script already running")
            print(e.errno)
        # Traceback of OSError
        traceback.print_exc()
        fd.close()
        exit(1)

    # Do other useful work

이제 문제는 잠자기 상태가 될 때 mylockfile을 수동으로 삭제하고 스크립트의 다른 인스턴스를 시작한다는 것입니다. 또한 이전 프로세스에 여전히 열린 파일 설명자가 첨부되어 있기 때문에 잠금을 획득할 수 없을 것으로 예상됩니다. 그러나 실제로 잠금을 획득했는데 왜 이런 일이 발생하는지 잘 모르겠습니다. 이것이 예상된 동작인 경우 잠긴 파일이 삭제되지 않도록 하려면 어떻게 해야 합니까?

답변1

잠긴 파일이 제거되면 열려 있는 파일 설명자와 파일 이름 간의 모든 관계가 손실됩니다. 따라서 새 프로세스는 실행 중인 다른 프로세스가 있음을 검색할 수 없습니다.

잠긴 파일이 일반 UNIX 권한을 넘어서 삭제되는 것을 방지할 방법도 없습니다. 충분한 권한이 부여되면 파일이 항상 삭제될 수 있습니다. 프로세스는 잠금 파일이 아직 존재하는지 여부를 주기적으로 확인하고 그에 따라 반응(잠금 파일을 종료하거나 다시 생성)할 수 있지만 이를 완벽하게 수행할 수 있는 방법은 없습니다.

관련 정보