lockfile 可以创建一个锁定文件,它就像一个互斥型信号量,当拥有这个信号量时便可以执行一个程序或脚本,反之需要等待先前的进程释放信号量。所以,信号量文件,又称锁定文件,是一种标记文件,如果特定的文件,设备,或者资源正在被一个特定的进程所使用,那么对于其它进程来说,可能需要等待,或者是智能进行有限的存取操作。
lockfile 的使用语法如下:lockfile -sleeptime | -r retries | -l locktimeout | -s suspend | -! | -ml | -mu | filename ...
下面使用一个简单的脚本来描述该命令的用法,脚本代码如下:
[Bash shell] 纯文本查看 复制代码 #!/bin/bash
if ! lockfile -r 0 ${0}.lock; then
echo "${0}.sh is running"
exit 1
fi
echo "hello lockfile, i will exit after 20s"
sleep 20
rm -f ${0}.lock
代码中,
${0} 表示该脚本的名称。
if 语句表示,如果创建锁文件失败,那么就退出;也就是说,如果已经有锁存在,那么就会创建失败,而已经有锁存在,那就说明已经有别的进程在运行这个脚本。如果成功创建锁文件,那么在 echo 后睡眠 20 秒,醒来后要记得将锁文件删除,这样别人进来时才能运行你这个脚本。
-r 0 表示一次都进行尝试就退出了。
现在运行上面的代码,然后在 20 秒内在另一终端里再尝试运行这个脚本,会看到提示:beyes@debian:~/command/lockfile$$ sh myscritp.sh
lockfile: Sorry, giving up on "myscritp.sh.lock"
myscritp.sh.sh is running
lockfile 的几个选项:
-sleeptime :该选项表示如果无法获取信号量(获得信号量就相当于可以创建 lock 文件)则睡眠多长时间(默认 8 秒),它和 -r 选项配合使用。
-r :该选项表示尝试的次数,它和 -sleeptime 配合使用。比如指定 sleeptime 为 5,而 -r 后跟 3 ,则表示如果未能获取信号量,会睡眠 5 秒,醒来后继续尝试获取信号量,一共着么搞 3 次,也就是 15 秒,如果还未能获取到信号量,那么就退出了。 |