想到一个问题,如果在crontab里有个定时任务设置为一分钟执行一次,但是它执行的时间可能会超过一分钟,此时crontab一分钟后会再次运行该脚本吗?这样会不会出现冲突呢?网上找了下,说可以用Linux中的进程锁控制crontab执行的并发问题。

给一个shell脚本加锁,使用flock命令。

一般格式:
flock [-sxun][-w #] fd#
flock [-sxon][-w #] file [-c] command...

常用选项:
-s, --shared :获得一个共享的锁。
-x, --exclusive :获得一个独占的锁。
-u, --unlock :移除一个锁,通常是不需要的,脚本执行完后会自动丢弃锁。
-n, --nonblock :如果没有立即获得锁直接失败而不是等待。
-w, --timeout :如果没有立即获得锁就等待指定的时间。
-o, --close :在运行命令前关闭文件的描述符。用于如果命令产生子进程时会不受锁的管控。
-c, --command :在shell中运行一个单独的命令。
-h, --help :显示帮助。
-V, --version :显示版本。

测试一下看看:
在/home目录下建立一个test.sh。

vim /home/test.sh

输入:

#!/bin/bash
wget --limit-rate=200k -P /tmp http://cachefly.cachefly.net/100mb.test

运行一个超过一分钟的命令。

chmod +x /home/test.sh

编辑crontab:

crontab -e

输入:

*/1 * * * * /usr/bin/flock -xn /var/run/test.lock -c '/home/test.sh'

设置每一分钟执行一次。

重启服务:

service crond restart

这样只有第一个进程执行完毕后,才会执行当前的下一个进程。在第一个进程执行过程中,下一分钟crontab运行flock检测到获得不了锁,就直接退出,直到第一个进程执行完,flock再次获得锁。

注:

1、这种使用文件锁的方式,在linux中非常常见,通过一个pid文件,来避免两个进程同时运行,mysql和postgresql都有pid文件,mysql中只记录了pid值,postgresql的pid中除了记录有pid值,还有数据目录,pid文件的创建时间,端口号,监听地址和共享内存的地址。

2、使用PID文件锁还有一个好处,方便进程向自己发停止或者重启信号。Nginx编译时可指定参数--pid-path=/var/run/nginx.pid,进程起来后就会把当前的PID写入这个文件,当然如果这个文件已经存在了,也就是前一个进程还没有退出,那么Nginx就不会重新启动。进程管理工具Supervisord也是通过记录进程的PID来停止或者拉起它监控的进程的

3、flock加的advisory lock,也就是建议性锁,巧合的是,postgresql中也有advisory lock,非常适用于秒杀等高并发的场景。flock是通过获取文件的fd来加锁的。

参考:

http://www.live-in.org/archives/1036.html

https://linux.die.net/man/2/flock

crontab使用进程锁解决冲突的更多相关文章

  1. Linux提示no crontab for root的解决办法

    Linux提示no crontab for root的解决办法 安装crontab:yum install crontabs 说明:/sbin/service crond start //启动服务/s ...

  2. Oracle用户密码过期和用户被锁解决方法【转】

    [原因/触发因素] 确定是由于Oracle11g中默认在default概要文件中设置了“PASSWORD_LIFE_TIME=180天”所导致. [影响和风险] 影响 密码过期后,业务进程连接数据库异 ...

  3. PHP进程锁

    <?php /** * CacheLock 进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的SQL请求穿透到数据库 * 用于解决PHP在并发时候的锁控制,通过文件/eacc ...

  4. 进程锁,队列,JoinableQueue

    内容梗概: 1.进程同步(锁) 2.队列(重点) 3.生产者消费者模式 4.JoinableQueue([maxsize]) 5.信号量(了解) 6.事件 1.进程同步(锁) 并发编程让我们能更加充分 ...

  5. Oracle开发包被锁解决办法-终极办法

    http://www.itpub.net/forum.php?mod=viewthread&tid=1761963 以前在数据库维护中,基本都是碰到表被锁的情况,然后就是查找被锁的表相关的信息 ...

  6. 探讨:crond 引发大量sendmail进程的解决办法

    某服务器账号comm无法登录,说是资源消耗完毕.于是用另一个账号登陆到服务器,检查common账号到底启动了哪些dd引起资源耗尽:ps -u common发现有个 sendmail的启动特别多例如:c ...

  7. python语法基础-并发编程-进程-进程锁和进程间通信

    ###############   守护进程  ############## """ 守护进程 父进程中将一个子进程设置为守护进程,那么这个子进程会随着主进程的结束而结束 ...

  8. git 教程(14)--解决冲突

    人生不如意之事十之八九,合并分支往往也不是一帆风顺的. 准备新的feature1分支,继续我们的新分支开发:

  9. Git命令行下解决冲突

    使用Git时,在pull.merge.rebase的过程中,经常会遇到conflict的情况. 遇到conflict时,以上处理过程会终端,并且命令行中显示(xxx|MERGING)的状态(Windo ...

随机推荐

  1. 第六章 高级I/O函数

    第六章 高级I/O函数 6.1 pipe函数 即管道函数,用于进程间的通信. #include<unistd.h> int pipe(int fd[2]); // fd:filedes / ...

  2. 【转】unity 热更新思路和实现

    声明:本文介绍的热更新方案是我在网上搜索到的,然后自己修改了一下,相当于是借鉴了别人的思路,加工成了自己的,在此感谢无私分享经验的朋友们. 想要使用热更新技术,需要规划设计好资源比较策略,资源版本,确 ...

  3. 简单的图片滑动效果插件 jQuery.iocnSlider.js

    近几日在制作一个客户引导页面,其中有一个图片展示而且带滑动的效果.好久没练手了,索性自己写一个插件吧. 依据设计原型,需要满足两套分辨率下图片不同的尺寸,所以在css中使用了media query的相 ...

  4. 【第四章】MySQL数据库的基本操作:数据库、表的创建插入查看

    MySQL数据库基本操作 创建表 create table 查看表结构 desc table, show create table 表完整性约束 修改表 alter table 复制表 create ...

  5. 深入理解eos账户体系 active和action

    在eos中,账户是一个非常重要的概念. 账户分为两部分组成 一种是active 一种是action. 智能合约本质上来讲就是一个action加上一个回馈脚本程序.任何智能合约都有这俩个部分组成. 那么 ...

  6. 20届的阿里 头条 网易 滴滴 百度 小米等Java面经

    转载连接 个人博客:junxuelian.cn 总结:个人感觉回答面试官问题不必太官方和书面化,腾讯sng招实习被发现照着百度百科念.结果可想而知.用自己的话和理解去回答就好.可能应届生会抱怨设计题, ...

  7. C语言--链表基础模板

    1.建立结构体 struct ST { int num;///学号 int score;///成绩 struct ST*next; };///结构体 2.空链表的创建 struct ST creatN ...

  8. 20172330 2017-2018-1 《Java程序设计》第九周学习总结

    20172330 2017-2018-1 <程序设计与数据结构>第九周学习总结 教材学习内容总结 本周的学习包括两章内容,分别为异常和递归. 异常 错误和异常都是对象,代表非正常情况或者无 ...

  9. WPF+数据库+三层

    1.计算类 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespac ...

  10. Word Ladder Problem (DFS + BFS)

    Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest t ...