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脚本实现文件锁功能相关推荐

  1. linux shell文件锁,shell脚本实现文件锁功能

    1.背景 当多个进程可能会对同样的数据执行操作时,这些进程需要保证其它进程没有在操作,以免损坏数据.通常,这样的进程会使用一个"锁文件",也就是建立一个文件来告诉别的进程自己在运行 ...

  2. Linux中shell编程——编写shell脚本,实现功能:在用户输入年、月后自动打印出对应年月的日

    实验目的 理解shell程序的设计方法 掌握shell程序编辑.运行.调试方法与过程 实验内容 shell简单编程 实验过程 要求: 1.记录实验过程,对关键过程进行文字说明并附上操作截屏. 2.逻辑 ...

  3. Shell脚本实现 ping功能

    Shell 脚本实现 ip ping 功能 具体代码: #!/bin/bash # ========================================================= ...

  4. 面向dba的linux shell 脚本简介,面向dba的linuxshell脚本简介.doc

    面向dba的linuxshell脚本简介.doc 面向DBA的LinuxShell脚本简介7年前,Oracle发布了Linux上的第一个商业数据库.从那时起,Oracle.RedHat和Novell/ ...

  5. 面向dba的linux shell 脚本简介,面向 DBA 的 Linux Shell 脚本简介

    DBA:Linux 面向 DBA 的 Linux Shell 脚本简介 作者:CasimirSaternos 学习一些在 Linux 上安装.运行和维护 Oracle 数据库所需的基本 bash sh ...

  6. linux100day(day5)--编程原理和shell脚本

    通过前面的学习,我们对于linux文件系统有了一定的了解,我们接下来会初步接触编程原理和尝试编写shell脚本来实现功能. day05--编程原理和shell脚本初步认识 编程原理 在早期编程中,因为 ...

  7. linux端口扫描脚本ip段,shell脚本结合iptables防端口扫描的实现

    网上有现在的防端口工具,如psad.portsentry,但觉得配置有点麻烦,且服务器不想再装一个额外的软件.所以自己就写了个shell脚本实现这个功能.基本思路是:使用iptables的recent ...

  8. html怎么shell脚本语言,简单shell脚本例子

    为什么要使用Shell脚本 使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象.缺点是:它们的效率通常不如编译型语言.不过权衡之下,通常使用脚本编程还是值 ...

  9. 利用shell脚本将json文件导入es

    现要将保存在一个目录下所有后缀名为json文件导入es集群,每个json文件中都按回车行分隔的json数据,下面是利用shell脚本完成此功能的代码. 在运行脚本之前,先创建索引. [root@nod ...

  10. Linux嵌入式开发——shell脚本

    文章目录 Linux嵌入式开发--shell脚本 一.shell脚本基本原则 二.shell脚本语法 2.1.编写shell脚本 2.2.交互式shell脚本 2.3.shell脚本的数值计算 2.4 ...

最新文章

  1. python中的tuple_python 数据类型 - tuple
  2. java jar包 和 war包 区别
  3. add binary java_LeetCode算法题-Add Binary(Java实现)
  4. rp-provide-from-last
  5. boost::sort模块float_sort 右移函子排序示例
  6. Fiori note automatic delete deletion scenario
  7. tomcat 设置java_为tomcat配置java环境变量
  8. oracle取时间最近的一条数据_当数据库最近一直卡顿时,第一时间应该用这条sql来分析...
  9. 关于php网络爬虫phpspider
  10. python求梯形面积_python计算梯形面积
  11. 重装电脑系统前,如何设置BIOS ?
  12. 什么是 DeFi(去中心化金融)?
  13. 来也科技收购Mindsay背后:新旧势力交锋智能自动化备受关注
  14. ofo小黄车骑车券无条件领取,人人有份!
  15. Android Studio中如何将ijkplayer 0.6.3导入自己的项目中并使用
  16. 一切皆组件的Flutter,安能辨我是雄雌
  17. oracle的date_add,SQL Server 中add函数到 oracle date add的操作
  18. 宁德时代打响增长保卫战
  19. Python百度地图API,通过区县、村镇地址获取完整省市区行政区划
  20. 计算机如何调音乐模式,均衡器如何调,音乐更好听

热门文章

  1. Apache Flink SQL概览
  2. java基础---Java---面试题---银行业务调度系统(线程同步锁、枚举、线程池)
  3. python天气预报的功能介绍_40行Python代码实现天气预报和每日鸡汤推送功能
  4. 数据库的增加,删除,更新操作--mysql
  5. 帆软单元格以HTML显示内容(点击更改herf值和onclik值)
  6. 常用正则表达式归类贴
  7. 20个你可能不知道的 Linux 网络工具
  8. [转载]Qlist的用法
  9. nginx反向代理负载均衡简述
  10. (转)Three.JS学习 9:WEBVR 入门demo