介绍一下参数:
-s 为共享锁,在定向为某文件的 FD 上设置共享锁而未释放锁的时间内,其他进程试图在定向为此文件的 FD 上设置独占锁的请求失败,而其他进程试图在定向为此文件的 FD 上设置共享锁的请求会成功。
-e 为独占或排他锁,在定向为某文件的 FD 上设置独占锁而未释放锁的时间内,其他进程试图在定向为此文件的 FD 上设置共享锁或独占锁都会失败。只要未设置 -s 参数,此参数默认被设置。
-u 手动解锁,一般情况不必须,当 FD 关闭时,系统会自动解锁,此参数用于脚本命令一部分需要异步执行,一部分可以同步执行的情况。
-n 为非阻塞模式,当试图设置锁失败,采用非阻塞模式,直接返回 1 ,并继续执行下面语句。
-w 设置阻塞超时,当超过设置的秒数,就跳出阻塞,返回值设置为 1 ,并继续执行下面语句。
-o 必须是使用第一种格式时才可用,表示当执行 command 前关闭设置锁的 FD ,以使 command 的子进程不保持锁。
-c 执行其后的 comand 。
举个实用的例子:
[lingyun@localhost rootfs]$ cat mylockfile.sh
#!/bin/sh
set -x
#exec 6<>"mylockfile.sh"
{
flock -n 6
#[ "$?" -eq "1" ] && {echo "fail";exit;}
if [ "$?" -eq "1" ] ; then
echo "fail";
exit;
fi
echo $$
sleep 10
} 6<>"mylockfile.sh"
[lingyun@localhost rootfs]$
[lingyun@localhost rootfs]$ chmod a+x mylockfile.sh
第一个终端 :
[lingyun@localhost rootfs]$ sh mylockfile.sh
+ flock -n 6
+ '[' 0 -eq 1 ']'
+ echo 27292
27292
+ sleep 10
睡眠10秒钟,同时我在另一个终端上运行这个脚本会出现如下情形:
第二个终端:
[lingyun@localhost rootfs]$ sh mylockfile.sh
+ flock -n 6
+ '[' 1 -eq 1 ']'
+ echo fail
fail
+ exit
所以理解-n选项后就会明白了