简介
工具型软件cron是一款类Unix的操作系统下的基于时间的任务管理系统。用户们可以通过cron在固定时间、日期、间隔下,运行定期任务(可以是命令和脚本)。cron常用于运维和管理,但也可用于其他地方,如:定期下载文件和邮件。cron该词来源于希腊语chronos(χρόνος),原意是时间。
通常,任务时间表(crontab)文件储存的指令被crond守护进程激活,守护进程在后台运行,并每一分钟检查是否有定期的作业需要执行。这类作业一般称为cron jobs。
我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。
- /var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
- /etc/crontab 这个文件负责调度各种管理和维护任务。
- /etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
- 我们还可以把脚本放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。
使用
Crontab常用命令格式如下
crontab [-u username] //缺省时值为当前操作用户的crontab
-e (编辑工作表)
-l (列出工作表里的命令)
-r (删除工作作)
我们可以使用crontab -e
进入当前用户的工作表编辑界面
最常见的是vim页面,每行都是一条命令
crontab的命令组成为时间+动作
其中时间
有分、时、日、月、周
五种
操作符有:
- ***** 取值范围内的所有数字
- / 每过多少个数字
- - 从X到Z
- **,**散列数字
如何让一个定时任务一次执行多个命令
多个命令可以放在一行上,其执行情况得依赖于用在命令之间的分隔符。
如果每个命令被一个分号";"所分隔,那么命令会连续的执行下去
如果每个命令被 && 号分隔,那么这些命令会一直执行下去,如果中间有错误的命令存在,则不再执行后面的命令,没错则执行到完为止
如果每个命令被双竖线(||)分隔符分隔,如果命令遇到可以成功执行的命令,那么命令停止执行,即使后面还有正确的命令则后面的所有命令都将得不到执行。假如命令一开始就执行失败,那么就会执行 || 后的下一个命令,直到遇到有可以成功执行的命令为止,假如所有的都失败,则所有这些失败的命令都会被尝试执行一次
为什么有的定时任务的命令没有被执行?
可能是Crontab没有找到相关的二进制文件,你需要在命令中明确指定相关命令的二进制文件的位置。
以Docker命令为例,假设你想要执行docker cp /etc/localtime bitwardenrs:/etc/localtime
,它在命令行中执行没有任何问题,但是在crontab里面可能会出问题,原因就是crontab不知道docker在哪里。
那么如何明确告诉Crontab相应的文件位置呢?以上面的docker命令为例,我们怎么知道这个docker是哪里的docker?
方法很简单:使用which命令
[root@server ~]# which docker
/usr/bin/docker
如此一来我们便得知了docker的位置了,那么命令换成/usr/bin/docker cp /etc/localtime bitwardenrs:/etc/localtime
就没问题了。
如何查看crontab执行日志
tail -f /var/log/cron
实例
实例1:每1分钟执行一次myCommand
* * * * * myCommand
实例2:每小时的第3和第15分钟执行
3,15 * * * * myCommand
实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand
实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * myCommand
实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand
实例6:每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
实例7:每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
实例8:每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart
实例10:每星期六的晚上11 : 00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart
实例11:每一小时重启smb
0 */1 * * * /etc/init.d/smb restart
实例12:晚上11点到早上7点之间,每隔一小时重启smb
0 23-7/1 * * * /etc/init.d/smb restart
示例13:每天0点26分执行acme.sh脚本
26 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
示例14:每天0点同步服务器时间
0 0 * * * /usr/sbin/ntpdate ntp.aliyun.com
示例15:每分钟同步服务器时间并同步硬件时间
* * * * * /usr/sbin/ntpdate ntp.aliyun.com;/usr/sbin/hwclock --systohc
示例16:每分钟同步服务器的本机时间到指定容器中去,可以修复容器时间错误的问题,防止一些时间敏感的容器运行出错
* * * * * /usr/bin/docker cp /etc/localtime bitwardenrs:/etc/localtime
参考链接:https://www.runoob.com/w3cnote/linux-crontab-tasks.html