linux⽂件锁代码,shell脚本实现⽂件锁功能
1.背景
当多个进程可能会对同样的数据执⾏操作时,这些进程需要保证其它进程没有在操作,以免损坏数据。通常,这样的进程会使⽤⼀个“锁⽂件”,也就是建⽴⼀个⽂件来告诉别的进程⾃⼰在运⾏,如果检测到那个⽂件存在则
2.关于flock
flock 是对于整个⽂件的建议性锁。也就是说,如果⼀个进程在⼀个⽂件(inode)上放了锁,那么其它进程是可以知道的。(建议性锁不强求进程遵守。)最棒的⼀点是,它的第⼀个参数是⽂件描述符,在此⽂件描述符关闭时,锁会⾃动释放。⽽当进程终⽌时,所有的⽂件描述符均会被关闭。
3. shell中实现flock系统调⽤的命令是flock,其使⽤格式有以下两种(man flock)
复制代码 代码如下:
flock [-sxon] [-w timeout] lockfile [-c]
flock [-sxun] [-w timeout] fd
选项和参数:
-s,--shared:获取⼀个共享锁,在定向为某⽂件的FD上设置共享锁⽽未释放锁的时间内,其他进程试图在定向为此⽂件的FD上设置独占锁的请求失败,⽽其他进程试图在定向为此⽂件的FD上设置共享锁的请求会成功。
-u,--unlock:⼿动释放锁,⼀般情况不必须,当FD关闭时,系统会⾃动解锁,此参数⽤于脚本命令⼀部分需要异步执⾏,⼀部分可以同步执⾏的情况。
-n,--nb, --nonblock:⾮阻塞模式,当获取锁失败时,返回1⽽不是等待
-w, --wait, --timeout seconds:设置阻塞超时,当超过设置的秒数时,退出阻塞模式,返回1,并继续执⾏后⾯的语句
-o, --close:表⽰当执⾏command前关闭设置锁的FD,以使command的⼦进程不保持锁。
-c, --command command:在shell中执
4. shell中实现排它锁避免脚本重复执⾏
linux中的例⾏性⼯作排程crontab会定时执⾏⼀些脚本,但脚本的执⾏时间往往⽆法控制,当脚本执⾏时间过长时,可能会导致上⼀次任务的脚本还没执⾏完,下⼀次任务的脚本⼜开始执⾏了。这种情况下可能会出现⼀些并发问题,严重时会导致出现脏数据/性能瓶颈的恶性循环。
linux循环执行命令脚本
通过使⽤flock建⽴排它锁可以规避这个问题,如果⼀个进程对某个加了排他锁,则其它进程⽆法加锁,可以选择等待超时或马上返回。测试实例如下:
4.1 创建执⾏脚本
复制代码 代码如下:
#cat /scripts/shell/file_lock.sh
#!/bin/bash
# Description: test for file flock
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo ""
echo "----------------------------------"
echo "start at `date '+%Y-%m-%d %H:%M:%S'` ..."
sleep 140s
echo "finished at `date '+%Y-%m-%d %H:%M:%S'` ..."
4.2 创建定时任务:测试排它锁
复制代码 代码如下:
#crontab -e
* * * * * flock -xn /dev/shm/test.lock -c "sh /scripts/shell/file_lock.sh > /root/stdout.log"
每分钟执⾏⼀次该脚本,并将输出信息写⼊到stdout.log
查看输出⽇志如下:
复制代码 代码如下:
----------------------------------
start at 2014-04-10 10:23:01 ...            #获取锁
finish at 2014-04-10 10:25:21 ...          #释放锁
----------------------------------
start at 2014-04-10 10:26:01 ...            #10:27:00及10:28:00启动的定时任务由于⽆法获取锁,以失败⽽退出执⾏,直到
10:26:00才获取到锁
finish at 2014-04-10 10:28:21 ...
4.3 测试排它锁,加上等待超时
复制代码 代码如下:
查看⽇志输出信息:
复制代码 代码如下:
----------------------------------
start at 2014-04-10 10:29:01 ...
finish at 2014-04-1编程客栈0 10:31:21 ...
----------------------------------
start at 2014-04-10 10:31:21 ...    #10:31:00启动的定时任务等待了20秒后,上⼀个任务释放了锁,所以此任务可以马上拿到锁,并继续执⾏
finish at 2014-04-10 10:33:41 ...
本⽂标题: shell脚本实现⽂件锁功能

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。