可以通过 flock 文件锁,保护相同数据同时被多个进程操作;也可以同时运行多个相同进程。

flock 参数

-s,–shared:获取一个共享锁,在定向为某文件的FD上设置共享锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置独占锁的请求失败,而其他进程试图在定向为此文件的FD上设置共享锁的请求会成功。

-x,-e,–exclusive:获取一个排它锁,或者称为写入锁,为默认项

-u,–unlock:手动释放锁,一般情况不必须,当FD关闭时,系统会自动解锁,此参数用于脚本命令一部分需要异步执行,一部分可以同步执行的情况。

-n,–nb, –nonblock:非阻塞模式,当获取锁失败时,返回1而不是等待

-w, –wait, –timeout seconds:设置阻塞超时,当超过设置的秒数时,退出阻塞模式,返回1,并继续执行后面的语句

-o, –close:表示当执行command前关闭设置锁的FD,以使command的子进程不保持锁。

-c, –command command:在shell中执行其后的语句

防止重复执行示例

  1. crontab运用flock防止重复执行
1
0 23 * * * (flock -xn ./test.lock -c "sh /root/test.sh") #-n 为非阻塞模式
  1. 阻塞超时模式
1
flock --wait 5  -e ./test.lock -c "sh /root/test.sh"
  1. 在脚本中,把文件打开为一个文件描述符,用flock对描述符加锁
1
2
3
4
5
6
exec 123<>test.lock # 把test.lock文件打开为文件描述符123
flock --wait 5 || { 
    echo "can't get lock, exit"
    exit 1 
}

参考