在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...
分享到:
相关推荐
IDEA中编写并运行shell脚本的实现是指在Integrated Development Environment(IDE)中编写、配置和运行shell脚本的过程。该过程需要安装bashsupport插件,配置插件,安装git软件,配置IDEA环境,创建Bash Script文件...
Linux 是一个多用户、多任务的操作系统,因此在 shell 脚本中设置锁机制是非常必要的,以避免多个进程同时访问同一个资源,导致数据不一致或其他问题。Linux 提供了 flock 命令来实现锁机制,该命令可以在 shell ...
然而,对于非root用户来说,确实有一些方法可以实现对shell脚本的调用,尤其是在开发和调试过程中。下面我们将深入探讨如何在Android应用中执行shell脚本以及相关知识点。 首先,我们需要理解Android的沙箱机制。每...
在Linux环境下,shell脚本是自动化任务的强大工具,尤其对于数据导出这样的操作,通过编写shell脚本可以方便地实现定期备份或者按需导出。本文将深入讲解如何使用shell脚本来实现数据的导出,并结合Java代码进行调用...
当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为“批处理进程”)。 在某些情况下,你也许想要知道运行中的子shell的PID。这个PID...
Shell脚本是Linux系统中的一种强大工具,它允许用户通过编写命令行指令序列来执行自动化任务。在这个场景中,我们讨论的是一个特定的Shell脚本,它的目标是生成二维码图片。在旧有的系统中,如果没有源码可供修改,...
在shell脚本中,这些步骤可以通过调用相应的Oracle管理工具(如`sqlplus`或`dbca`)来实现,并通过逻辑控制结构(如if、for循环)确保按顺序执行。 `createTable.sql` 文件很可能是包含创建数据库表结构的SQL脚本。...
### Shell 脚本实现服务器进程监控方法详解 在IT运维和开发环境中,服务器进程的稳定运行至关重要。本文将深入探讨如何使用Shell脚本实现服务器进程监控,这不仅有助于及时发现异常情况,还能提高系统的可用性和...
本文将深入探讨如何使用Shell脚本来实现文件锁功能,特别是排它锁,以防止脚本重复执行,确保数据安全和程序的正确性。 文件锁是多进程环境下控制资源访问的一种机制。在Linux系统中,当多个进程可能同时尝试修改同...
在shell脚本中,我们可以使用`mysql`命令行客户端来连接到MySQL服务器并运行SQL语句。例如: ```bash #!/bin/bash # 定义数据库连接信息 USER="your_mysql_user" PASSWORD="your_mysql_password" DATABASE="your_...
Android 系统或 Android 应用执行 shell 脚本是 Android 开发中的一项重要技术,通过执行 shell 脚本,可以实现一些复杂的操作,例如设置网络参数、启动服务等。下面我们将介绍两种让 Android 系统或 Android 应用...
如果在`bat`脚本中遇到进入`shell`后无法执行后续命令的问题,可能是因为没有正确处理命令的执行顺序或权限。确保每个命令都在适当的位置并赋予必要的执行权限是很关键的。 在编写`bat`脚本时,还需要注意以下几点...
Shell脚本,作为Linux/Unix系统中的编程工具,是一种强大的自动化任务执行手段。它基于Bourne shell或者其扩展版本,如bash(Bourne-Again SHell),提供了一种编写简单或复杂程序的方式,使得用户能够通过命令行...
在Linux环境中,shell是操作系统与用户交互的主要方式之一,它提供了命令行接口,允许用户执行各种操作。PHP是一种广泛使用的服务器端脚本语言,尤其在Web开发领域中扮演着重要角色。当我们需要在Linux服务器上自动...
# 检查通过sh命令执行的shell脚本是不是还在执行当中,避免重复执行. # 把这段代码放在需要保证唯一性的程序头部即可 # 注意,如果直接把此脚本放到cron里面执行的话,必须再grep -v ” -c sh “以排除由cron产生的...
资源名称:Linux Shell脚本学习基础视频资源目录:【】11a00d99b60c4e2eba3440b8aa3a6bdd【】linux_shell脚本编程_01认识shell,如何编写shell脚本和执行【】linux_shell脚本编程_02vivim简单的常用操作【】linux_...
在标题"Shell 脚本实现多线程的代码"中,我们关注的重点是如何在Shell脚本中实现多线程操作,这通常是为了提高程序的执行效率,让多个任务可以同时运行。 描述中提到的是一个具体的实现案例,即用Shell脚本来创建并...
在Linux系统中,Shell脚本是一种强大的自动化工具,可以实现一系列命令的集合,方便用户进行交互式操作。本文介绍的“非常简单的Shell菜单脚本”就是一种基础的Shell脚本应用,它创建了一个简单的菜单系统,使用户...
在IT行业中,shell脚本和bat脚本是两种常见的批处理工具,用于自动化执行一系列操作系统命令。当需要定期或按需运行Java程序时,利用这两种脚本语言可以极大地提高工作效率。下面将详细介绍如何使用shell脚本(适用...
这里我们关注的是使用Shell脚本来实现MySQL从原表到历史表的数据迁移。这种自动化的方法可以帮助我们高效、准确地处理大量数据,同时减少人为错误。 首先,让我们深入理解`shell`脚本。Shell是Linux和Unix系统中的...