用 Tcl 语言创建锁文件
锁可以用来避免两段程序的竞争——程序之间的竞争会引起逻辑上的错误。
lockfile 命令用法
lockfile task.lock
=lockfile -r -1 -8 task.lock
- 尝试获取锁,每次尝试之间等待8秒(默认值)
lockfile -l 60 task.lock
- 锁文件的有效期是60秒,之后锁文件被认为无效
lockfile -l 60 -s 3 task.lock
- 锁文件被认定失效后,等待3秒再创建新的锁文件
- 以避免由于两个进程的竞争删除了新建的锁文件
-s
参数的值默认是16秒
关于进程竞争,比如为了避免下面这种情况
Process #1 | Process #2
------------- + -----------
check lock | ...
... | check lock # 两者都判定锁文件失效
delete lock | ...
create lock | ...
... | delete lock # 锁文件被删
suspend | ... # 通过suspend避免锁文件被删
create lock | ... # 此处如果晚于进程2,也不算问题
用Tcl实现锁文件
锁文件的实现依赖于程序操作的原子性。主要是利用EXCL
标志位
proc lockfile {lockfile} {
try {
set flock [open $lockfile {CREAT EXCL RDWR}]
close $flock
return 1
} on error err {
return 0
}
}
打开模式选用RDWR
有一个好处是可以利用锁文件存储一些信息。
mkdir 操作也具有原子性。
Tcl自身的file mkdir
命令不能直接区分目录已经存在的情况。用Shell脚本表示其思路的话
mkdir task.lock && echo "lock succ"