«

Linux crontab防止重复执行任务的办法

Linux-man.cn 发布于 阅读:193 技术文章


问题

思考一个问题,如下Linux计划任务,假设1分钟内ls -a还没执行完,有什么办法能让crontab在下个周期内不执行ls -a命令?

*/1 * * * *  ls -a

答案是: flock命令

crontab任务改为以下写法:

*/1 * * * * flock -xn /tmp -c "ls -a"

flock命令扩展例子

flock命令它可以用来确保一个命令或脚本只有一个进程在运行,看几个列子:

1、只要其他人不需要锁,就运行带有文件锁的命令:

flock {{path/to/lock.lock}} -c "{{command}}"

2、运行带有文件锁的命令,如果锁不存在则退出:

flock {{path/to/lock.lock}} -n -c "{{command}}"

3、运行带有文件锁的命令,如果锁不存在,则以特定的错误代码退出:

flock {{path/to/lock.lock}} -n -E {{error_code}} -c "{{command}}"

flock命令主要选项

1、 -s --shared
获得共享锁
2、 -x --exclusive
获得排他锁(默认)
3、 -u --unlock
移除锁
4、 -n --nonblock
失败而不等待
5、 -w --timeout <秒数>
等待一段时间
6、 -E --conflict-exit-code <数字>
冲突或超时后的退出代码
7、 -o --close
在运行命令前关闭文件描述符
8、 -c --command <命令>
通过 shell 运行一条命令

相关命令

lslocks,列出本地系统锁,用法很简单,感兴趣可以man下。

[root@linuxtime]# lslocks 
COMMAND           PID  TYPE SIZE MODE  M      START        END PATH
tracker-store    3157 POSIX   7M READ  0 1073741826 1073742335 /root/.cache/tracker/meta.db
...省略N行...

linux crontab