Linux利用Crontab执行定时任务

Linux利用Crontab执行定时任务

hash070 536 2022-06-03

简介

工具型软件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:每分钟同步服务器的本机时间到指定容器中去,可以修复容器时间错误的问题,防止一些时间敏感的容器运行出错

1656479661826.png

* * * * * /usr/bin/docker cp /etc/localtime bitwardenrs:/etc/localtime

参考链接:https://www.runoob.com/w3cnote/linux-crontab-tasks.html