shell脚本实现文件锁功能
2019独角兽企业重金招聘Python工程师标准>>>
1.背景
当多个进程可能会对同样的数据执行操作时,这些进程需要保证其它进程没有在操作,以免损坏数据。通常,这样的进程会使用一个“锁文件”,也就是建立一个文件来告诉别的进程自己在运行,如果检测到那个文件存在则认为有操作同样数据的进程在工作。这样的问题是,进程不小心意外死亡了,没有清理掉那个锁文件,那么只能由用户手动来清理了。
2.关于flock
flock 是对于整个文件的建议性锁。也就是说,如果一个进程在一个文件(inode)上放了锁,那么其它进程是可以知道的。(建议性锁不强求进程遵守。)最棒的一点是,它的第一个参数是文件描述符,在此文件描述符关闭时,锁会自动释放。而当进程终止时,所有的文件描述符均会被关闭。
3. shell中实现flock系统调用的命令是flock,其使用格式有以下两种(man flock)
复制代码代码如下:
flock [-sxon] [-w timeout] lockfile [-c] command...
flock [-sxun] [-w timeout] fd
选项和参数:
-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中执行其后的语句
4. shell中实现排它锁避免脚本重复执行
Linux中的例行性工作排程crontab会定时执行一些脚本,但脚本的执行时间往往无法控制,当脚本执行时间过长时,可能会导致上一次任务的脚本还没执行完,下一次任务的脚本又开始执行了。这种情况下可能会出现一些并发问题,严重时会导致出现脏数据/性能瓶颈的恶性循环。
通过使用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 测试排它锁,加上等待超时
复制代码代码如下:
* * * * * flock -x -w 20 /dev/shm/test.lock -c "sh /scripts/shell/file_lock.sh > /root/stdout.log"
查看日志输出信息:
复制代码代码如下:
----------------------------------
start at 2014-04-10 10:29:01 ...
finish at 2014-04-10 10:31:21 ...
----------------------------------
start at 2014-04-10 10:31:21 ... #10:31:00启动的定时任务等待了20秒后,上一个任务释放了锁,所以此任务可以马上拿到锁,并继续执行
finish at 2014-04-10 10:33:41 ...
http://www.jb51.net/article/58757.htm
转载于:https://my.oschina.net/xiaominmin/blog/1584819
shell脚本实现文件锁功能相关推荐
- linux shell文件锁,shell脚本实现文件锁功能
1.背景 当多个进程可能会对同样的数据执行操作时,这些进程需要保证其它进程没有在操作,以免损坏数据.通常,这样的进程会使用一个"锁文件",也就是建立一个文件来告诉别的进程自己在运行 ...
- Linux中shell编程——编写shell脚本,实现功能:在用户输入年、月后自动打印出对应年月的日
实验目的 理解shell程序的设计方法 掌握shell程序编辑.运行.调试方法与过程 实验内容 shell简单编程 实验过程 要求: 1.记录实验过程,对关键过程进行文字说明并附上操作截屏. 2.逻辑 ...
- Shell脚本实现 ping功能
Shell 脚本实现 ip ping 功能 具体代码: #!/bin/bash # ========================================================= ...
- 面向dba的linux shell 脚本简介,面向dba的linuxshell脚本简介.doc
面向dba的linuxshell脚本简介.doc 面向DBA的LinuxShell脚本简介7年前,Oracle发布了Linux上的第一个商业数据库.从那时起,Oracle.RedHat和Novell/ ...
- 面向dba的linux shell 脚本简介,面向 DBA 的 Linux Shell 脚本简介
DBA:Linux 面向 DBA 的 Linux Shell 脚本简介 作者:CasimirSaternos 学习一些在 Linux 上安装.运行和维护 Oracle 数据库所需的基本 bash sh ...
- linux100day(day5)--编程原理和shell脚本
通过前面的学习,我们对于linux文件系统有了一定的了解,我们接下来会初步接触编程原理和尝试编写shell脚本来实现功能. day05--编程原理和shell脚本初步认识 编程原理 在早期编程中,因为 ...
- linux端口扫描脚本ip段,shell脚本结合iptables防端口扫描的实现
网上有现在的防端口工具,如psad.portsentry,但觉得配置有点麻烦,且服务器不想再装一个额外的软件.所以自己就写了个shell脚本实现这个功能.基本思路是:使用iptables的recent ...
- html怎么shell脚本语言,简单shell脚本例子
为什么要使用Shell脚本 使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象.缺点是:它们的效率通常不如编译型语言.不过权衡之下,通常使用脚本编程还是值 ...
- 利用shell脚本将json文件导入es
现要将保存在一个目录下所有后缀名为json文件导入es集群,每个json文件中都按回车行分隔的json数据,下面是利用shell脚本完成此功能的代码. 在运行脚本之前,先创建索引. [root@nod ...
- Linux嵌入式开发——shell脚本
文章目录 Linux嵌入式开发--shell脚本 一.shell脚本基本原则 二.shell脚本语法 2.1.编写shell脚本 2.2.交互式shell脚本 2.3.shell脚本的数值计算 2.4 ...
最新文章
- python中的tuple_python 数据类型 - tuple
- java jar包 和 war包 区别
- add binary java_LeetCode算法题-Add Binary(Java实现)
- rp-provide-from-last
- boost::sort模块float_sort 右移函子排序示例
- Fiori note automatic delete deletion scenario
- tomcat 设置java_为tomcat配置java环境变量
- oracle取时间最近的一条数据_当数据库最近一直卡顿时,第一时间应该用这条sql来分析...
- 关于php网络爬虫phpspider
- python求梯形面积_python计算梯形面积
- 重装电脑系统前,如何设置BIOS ?
- 什么是 DeFi(去中心化金融)?
- 来也科技收购Mindsay背后:新旧势力交锋智能自动化备受关注
- ofo小黄车骑车券无条件领取,人人有份!
- Android Studio中如何将ijkplayer 0.6.3导入自己的项目中并使用
- 一切皆组件的Flutter,安能辨我是雄雌
- oracle的date_add,SQL Server 中add函数到 oracle date add的操作
- 宁德时代打响增长保卫战
- Python百度地图API,通过区县、村镇地址获取完整省市区行政区划
- 计算机如何调音乐模式,均衡器如何调,音乐更好听