在 Linux 下使用 crontab 执行定时任务,如果任务自身运行时间超过任务执行的间隔时间,就有可能导致两次任务发生冲突,请问如何控制前一个任务执行完后再启动下一个任务?


      加个文件锁就OK了。每次任务执行时先判断锁文件是否存在,存在则退出任务,不存在则建立锁文件,任务执行完毕时删除该文件。在超出crontab执行的间隔时间的情况下,如果你还想继续执行之前没有执行的任务,则需要在脚本中判断当次任务执行时间,如果超过了crontab的间隔时间,那么在当前任务结束时进行系统调用执行该定时任务。


flock使用

  flock,建议性锁,不具备强制性。一个进程使用flock将文件锁住,另一个进程可以直接操作正在被锁的文件,修改文件中的数据,原因在于flock只是用于检测文件是否被加锁,针对文件已经被加锁,另一个进程写入数据的情况,内核不会阻止这个进程的写入操作,也就是建议性锁的内核处理策略。


-s, --shared:    获得一个共享锁  

-x, --exclusive: 获得一个独占锁  

-u, --unlock:    移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁  

-n, --nonblock:  如果没有立即获得锁,直接失败而不是等待  

-w, --timeout:   如果没有立即获得锁,等待指定时间  

-o, --close:     在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控  

-c, --command:   在shell中运行一个单独的命令  


[root@db52 tmp]# cat /tmp/test.sh

#!/bin/bash


echo "Hello World"

sleep 10


[root@db52 tmp]# crontab -l

#crond-id-001:time sync

*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1


#crond-id-002:test

* * * * * /usr/bin/flock -xn /tmp/test.lock -c "/bin/sh /tmp/test.sh" >/dev/null 2>&1