用 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"