다른 프로세스의 잠금 확인 및 테스트

다른 프로세스의 잠금 확인 및 테스트

init.d제가 가장 좋아하는 애플리케이션 중 하나에 대한 서비스 래퍼(스크립트)를 만들려고 합니다. 애플리케이션이 동시에 생성됩니다.PID 및 잠금 파일, 그래서 나는 내 신청서의 정확한 상태를 보고하고 내 서비스가 여러 사본을 시작하는 것을 방지하기 위해 이를 사용하려고 노력합니다.

불행하게도 응용 프로그램(또는 시스템)이 때때로 충돌하여 PID 및 잠금 파일이 남아 있기 때문에 응용 프로그램이 실행 중인지 확인하기 위해 이러한 파일이 존재하는지 확인할 수 없습니다.

POSIX WRITE에 따르면 응용 프로그램은 잠긴 파일에 잠금을 생성 lslocks하지만 create a lock 명령을 사용하여 잠금을 생성하려고 하면 flock -x -n "$file" echo dummy놀랍게도 성공하는 것 같습니다. 파일 삭제도 성공했고( rm "$file"), 파일 쓰기도 성공했는데, 이는 BTRFS 시스템에서는 어느 정도 이해가 되지만 덜 번거롭지는 않습니다.

POSIX그렇다면 파일에 잠금( 또는 ) 이 있는지 확인하기 위해 어떻게 파일을 쿼리합니까 FLOCK?

답변1

이 작업을 수행하기 위해 스크립트에서 다음 함수를 사용했습니다.

getPIDLock () {
    if [ ! -e "$LockFile" ]; then
        return 0 # Not an error, but lsof will emit a lot of text if the file doesn't exist
    fi
    local PIDLock=$( lsof -F p "$1" | head -n 1 )
    local strEcho='echo ${PID:1}'
    bash -c "PID=\"$PIDLock\";$strEcho;" # Assuming system has BASH, but not assuming that the default shell is BASH
    return 0
}

문제의 파일이 잠겨 있으면 PID를 내보내고, 그렇지 않으면 빈 문자열을 내보냅니다.

PID=$( getPIDLock "/path/to/pidfile" )
if [ -n $PID ]; then
    # Do your thing
fi

관련 정보