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行...