crontab使用进程锁解决冲突

想到一个问题,如果在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再次获得锁。

《crontab使用进程锁解决冲突》上的5个想法

  1. 你好,如何解决这个问题呢?
    如果某shell脚本通常10秒就能完成并退出,但有时会卡住,原因比如是网络问题,flock独占锁导致脚本再次被crontab调用时,直接退出不再执行,所以我希望flock运行的脚本10分钟后自动强制结束,如何才能办到呢?
    windows的计划任务自带这个选项,在linux上,真的找不到这个功能。

    1. 你好,crontab好像没有这个功能,我觉得可以再运行一个脚本获得指定脚本的pid,这样就有办法把它kill掉了

评论已关闭。