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