背景
在进行后台开发的时候,由于项目本身由多位同事维护,而布设的测试服务器仅一台, 便经常出现脚本执行的多线程(多人) 问题。
比如我们有一个rebuild脚本, 负责重新编译整个项目, 有的时候同时我更新了代码,便登陆测试服务器更新编译,殊不知另一个同事也在编译, 于是两个人都编译不好了, 而且如果不在意的话, 根本不知道是怎么回事。
为了解决这个问题, 我让这个rebuild脚本在执行编译前先尝试锁住一个文件,然后再编译,这样当我试图在别的同事编译的时候编译的话就会失败,我自己也会被告知原因,也不影响其他同事。
脚本
#!/bin/bash
touch tmp_lock_file
{
flock -n 11
if [ "$?" -eq "1" ]; then
echo "There are others using this script";
exit;
fi
# build project below
# ...
} 11<"tmp_lockfile"
`
flock 命令
一下为对 man linux的翻译 。
名字
flock - 在 shell 脚本中管理文件锁
语法
#锁特定文件或者文件夹, 如果权限合适的话,在lockfile不存在的时候会创建之。
flock [-sxon] [-w timeout] lockfile [-c] command...
flock [-sxon] [-w timeout] lockdir [-c] command...
#锁特定文件描述符。
flock [-sxun] [-w timeout] fd
描述
这个命令提供通过shell脚本或者其他命令行执行 flock 锁 函数的功能。
使用文件描述符的常用格式 :
(
flock -s 200
# ... commands executed under lock ...
) 200>/var/lock/mylockfile # 使用 > 的好处是文件不存在的时候会主动创建。
默认设置是flock阻塞直至获取锁。 当然我们可以通过 -n 参数使之立刻返回。
选项
-s, –shared
获得一个共享锁, 可以认为是一个读锁。
-x, -e, –exclusive
获得一个独占锁, 也就是写锁, 默认是这种类型。
-u, –unlock
丢弃一个锁。通常,由于锁会在文件描述符释放的时候自动丢弃,所以不需要这个选项。 某些特殊情况可能需要这个,比如enclosed命令组会创建一个后天进程但是这个进程并不持有锁。
-n, –nb, –nonblock
非阻塞( 失败的话不是等待而是立刻返回1)。
-w, –wait, –timeout seconds
超时等待,如果不能在规定的秒数内获得锁的话,就返回 1 .参数应该是整数。
-o, –close
在执行名列前关闭这个锁锁住的文件描述符。如果这个命令要产生一个不持有这个锁的子进程的话这个参数就好使了。
-c, –command command
执行一个命令
-h, –help
打印
作者
Written by H. Peter Anvin hpa@zytor.com.