在 Linux 下使用 crontab 执行定时任务,若是任务自身运行时间超过任务执行的间隔时间,就有可能致使两次任务发生冲突,请问如何控制前一个任务执行完后再启动下一个任务?shell
加个文件锁就OK了。每次任务执行时先判断锁文件是否存在,存在则退出任务,不存在则创建锁文件,任务执行完毕时删除该文件。在超出crontab执行的间隔时间的状况下,若是你还想继续执行以前没有执行的任务,则须要在脚本中判断当次任务执行时间,若是超过了crontab的间隔时间,那么在当前任务结束时进行系统调用执行该定时任务。bash
flock使用ide
flock,建议性锁,不具有强制性。一个进程使用flock将文件锁住,另外一个进程能够直接操做正在被锁的文件,修改文件中的数据,缘由在于flock只是用于检测文件是否被加锁,针对文件已经被加锁,另外一个进程写入数据的状况,内核不会阻止这个进程的写入操做,也就是建议性锁的内核处理策略。进程
-s, --shared: 得到一个共享锁 crontab
-x, --exclusive: 得到一个独占锁 it
-u, --unlock: 移除一个锁,一般是不须要的,脚本执行完会自动丢弃锁 class
-n, --nonblock: 若是没有当即得到锁,直接失败而不是等待 test
-w, --timeout: 若是没有当即得到锁,等待指定时间 date
-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