`
blueswind8306
  • 浏览: 126967 次
  • 来自: ...
社区版块
存档分类
最新评论

在shell中实现排它锁以避免脚本重复执行

阅读更多
在linux中,我们经常会用到crontab定时执行一些脚本,但脚本的执行时间往往无法控制,当脚本执行时间过长时,可能会导致上一次任务的脚本还没执行完,下一次任务的脚本又开始执行了。这种情况下可能会出现一些并发问题,严重时会导致出现脏数据/性能瓶颈的恶性循环。

针对这个问题,可以使用linux的flock来解决,flock支持共享锁和排它锁,如果一个进程对某个加了排他锁,则其它进程无法加锁,可以选择等待超时或马上返回。

具体可以参考以下两篇文章:
Linux 2.6 中的文件锁
flock——Linux 下的文件锁

我在我的CentOS 5.8上做了一个简单的测试:

1.准备一个file-lock-test.sh脚本:
引用

#/bin/bash

echo ""
echo "---------------------------------"
echo "start at `date '+%Y-%m-%d %H:%M:%S'`..."

sleep 140s

echo "finished at `date '+%Y-%m-%d %H:%M:%S'`..."


2.测试排它锁
在crontab中定义如下一个定时任务(每分钟执行一次)
引用

* * * * * flock -xn /dev/shm/test.lock -c "sh /opt/gaosong/file-lock-test.sh >> /opt/gaosong/stdout.log"

输出日志文件如下:
引用

---------------------------------
start at 2013-08-09 11:36:01... #获取到锁
finished at 2013-08-09 11:38:21... #此时释放所

---------------------------------
start at 2013-08-09 11:39:01...         #11:38:00启动的定时任务由于拿不到锁,所以马上退出了,导致11:39:00才能拿到锁
finished at 2013-08-09 11:41:21...


3.测试排它锁+等待超时
将定时任务改为:
引用

* * * * * flock -x -w 30 /dev/shm/test.lock -c "sh /opt/gaosong/file-lock-test.sh >> /opt/gaosong/stdout.log"

输出日志文件如下:
引用

---------------------------------
start at 2013-08-09 11:42:01...
finished at 2013-08-09 11:44:21...

---------------------------------
start at 2013-08-09 11:44:21... #11:44:00启动的定时任务等待了20秒后,上一个任务释放了锁,所以此任务可以马上拿到锁,并继续执行
finished at 2013-08-09 11:46:41...

0
0
分享到:
评论
2 楼 blueswind8306 2013-08-14  
lionfox 写道
如果用进程id &进程名字 结合ps -ef | grep id | grep name|wc -l
这样是不是也可以呢


这样有并发问题,类似如下伪代码:
pid=`cat pidfile`
process=`ps -ef |grep $pid |grep name|wc -l`
if [ $process -eq 0 ]; then
  echo $$ > pidfile
  do something...
fi


如果同时有两个进程同时执行到if判断这行,可能两个进程都得到true的结果,这时候就会出现同时执行的情况,并且后一个进程会覆盖写入前一个进程的pidfile。

但对于flock命令则不同,它会直接尝试对某个文件加锁,并且加锁操作是原子的,这样如果进程1加锁成功,进程2就一定加锁失败并返回(或者阻塞等待锁释放)。
具体可以参考:Linux 2.6 中的文件锁这篇文章的“Linux 中关于文件锁的系统调用”这段
1 楼 lionfox 2013-08-09  
如果用进程id &进程名字 结合ps -ef | grep id | grep name|wc -l
这样是不是也可以呢

相关推荐

    IDEA中编写并运行shell脚本的实现

    IDEA中编写并运行shell脚本的实现是指在Integrated Development Environment(IDE)中编写、配置和运行shell脚本的过程。该过程需要安装bashsupport插件,配置插件,安装git软件,配置IDEA环境,创建Bash Script文件...

    Linux下在shell脚本中设置锁的命令

    Linux 是一个多用户、多任务的操作系统,因此在 shell 脚本中设置锁机制是非常必要的,以避免多个进程同时访问同一个资源,导致数据不一致或其他问题。Linux 提供了 flock 命令来实现锁机制,该命令可以在 shell ...

    android系统中调用shell脚本

    然而,对于非root用户来说,确实有一些方法可以实现对shell脚本的调用,尤其是在开发和调试过程中。下面我们将深入探讨如何在Android应用中执行shell脚本以及相关知识点。 首先,我们需要理解Android的沙箱机制。每...

    linux下shell脚本实现数据的导出

    在Linux环境下,shell脚本是自动化任务的强大工具,尤其对于数据导出这样的操作,通过编写shell脚本可以方便地实现定期备份或者按需导出。本文将深入讲解如何使用shell脚本来实现数据的导出,并结合Java代码进行调用...

    Shell脚本中获取进程ID的方法

    当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为“批处理进程”)。 在某些情况下,你也许想要知道运行中的子shell的PID。这个PID...

    Shell脚本实现二维码图片生成

    Shell脚本是Linux系统中的一种强大工具,它允许用户通过编写命令行指令序列来执行自动化任务。在这个场景中,我们讨论的是一个特定的Shell脚本,它的目标是生成二维码图片。在旧有的系统中,如果没有源码可供修改,...

    linux下批量执行oracle脚本的shell脚本

    在shell脚本中,这些步骤可以通过调用相应的Oracle管理工具(如`sqlplus`或`dbca`)来实现,并通过逻辑控制结构(如if、for循环)确保按顺序执行。 `createTable.sql` 文件很可能是包含创建数据库表结构的SQL脚本。...

    shell脚本实现服务器进程监控的方法

    ### Shell 脚本实现服务器进程监控方法详解 在IT运维和开发环境中,服务器进程的稳定运行至关重要。本文将深入探讨如何使用Shell脚本实现服务器进程监控,这不仅有助于及时发现异常情况,还能提高系统的可用性和...

    shell脚本实现文件锁功能

    本文将深入探讨如何使用Shell脚本来实现文件锁功能,特别是排它锁,以防止脚本重复执行,确保数据安全和程序的正确性。 文件锁是多进程环境下控制资源访问的一种机制。在Linux系统中,当多个进程可能同时尝试修改同...

    shell执行mysql脚本

    在shell脚本中,我们可以使用`mysql`命令行客户端来连接到MySQL服务器并运行SQL语句。例如: ```bash #!/bin/bash # 定义数据库连接信息 USER="your_mysql_user" PASSWORD="your_mysql_password" DATABASE="your_...

    如何让Android系统或Android应用执行shell脚本

    Android 系统或 Android 应用执行 shell 脚本是 Android 开发中的一项重要技术,通过执行 shell 脚本,可以实现一些复杂的操作,例如设置网络参数、启动服务等。下面我们将介绍两种让 Android 系统或 Android 应用...

    Logcat及adb shell命令的bat脚本实现例子

    如果在`bat`脚本中遇到进入`shell`后无法执行后续命令的问题,可能是因为没有正确处理命令的执行顺序或权限。确保每个命令都在适当的位置并赋予必要的执行权限是很关键的。 在编写`bat`脚本时,还需要注意以下几点...

    Shell脚本学习教程PDF版

    Shell脚本,作为Linux/Unix系统中的编程工具,是一种强大的自动化任务执行手段。它基于Bourne shell或者其扩展版本,如bash(Bourne-Again SHell),提供了一种编写简单或复杂程序的方式,使得用户能够通过命令行...

    使用shell调用php脚本

    在Linux环境中,shell是操作系统与用户交互的主要方式之一,它提供了命令行接口,允许用户执行各种操作。PHP是一种广泛使用的服务器端脚本语言,尤其在Web开发领域中扮演着重要角色。当我们需要在Linux服务器上自动...

    Shell脚本避免重复执行的方法

    # 检查通过sh命令执行的shell脚本是不是还在执行当中,避免重复执行. # 把这段代码放在需要保证唯一性的程序头部即可 # 注意,如果直接把此脚本放到cron里面执行的话,必须再grep -v ” -c sh “以排除由cron产生的...

    LinuxShell脚本学习基础视频

    资源名称:Linux Shell脚本学习基础视频资源目录:【】11a00d99b60c4e2eba3440b8aa3a6bdd【】linux_shell脚本编程_01认识shell,如何编写shell脚本和执行【】linux_shell脚本编程_02vivim简单的常用操作【】linux_...

    Shell 脚本实现多线程的代码

    在标题"Shell 脚本实现多线程的代码"中,我们关注的重点是如何在Shell脚本中实现多线程操作,这通常是为了提高程序的执行效率,让多个任务可以同时运行。 描述中提到的是一个具体的实现案例,即用Shell脚本来创建并...

    非常简单的Shell菜单脚本

    在Linux系统中,Shell脚本是一种强大的自动化工具,可以实现一系列命令的集合,方便用户进行交互式操作。本文介绍的“非常简单的Shell菜单脚本”就是一种基础的Shell脚本应用,它创建了一个简单的菜单系统,使用户...

    shell,bat脚本运行java程序

    在IT行业中,shell脚本和bat脚本是两种常见的批处理工具,用于自动化执行一系列操作系统命令。当需要定期或按需运行Java程序时,利用这两种脚本语言可以极大地提高工作效率。下面将详细介绍如何使用shell脚本(适用...

    shell脚本实现mysql从原表到历史表数据迁移

    这里我们关注的是使用Shell脚本来实现MySQL从原表到历史表的数据迁移。这种自动化的方法可以帮助我们高效、准确地处理大量数据,同时减少人为错误。 首先,让我们深入理解`shell`脚本。Shell是Linux和Unix系统中的...

Global site tag (gtag.js) - Google Analytics