init.d
我正在尝试围绕我最喜欢的应用程序之一创建一个服务包装器(脚本)。该应用程序同时创建PID 和锁定文件,因此我尝试使用它们来确保我可以报告应用程序的准确状态并防止我的服务启动多个副本。
不幸的是,应用程序(或系统)有时会崩溃,留下 PID 和锁定文件,因此我不能仅检查这些文件是否存在来确定我的应用程序是否正在运行。
POSIX
WRITE
根据,应用程序确实在锁定文件上创建了一个锁,一个锁,lslocks
但似乎如果我尝试使用 创建一个锁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