有时候我们会需要定时执行一些任务,比如定时每n分钟执行一个备份,或者每天凌晨3点执行一个备份,或者每个月5号或者每5天或者每周3执行某个任务,Linux中的定时任务是通过 crontab 来实现的。本文讲的就是 crontab 的使用
本文参考:

crontab文档: https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html

我的系统: Linux Debian

使用流程

  • 检查是否安装crontab
    • 方法1: 执行service cron status
      • 出现cron.service - Regular background program processing daemon说明已安装;
      • 出现Unit cron.service could not be found.说明未安装
    • 方法2: 执行service cron
      • 出现[info] Usage: /etc/init.d/cron {start|stop|status|restart|reload|force-reload}.说明已安装;
      • 出现cron: unrecognized service说明未安装
    • 如果出现Unit cron.service could not be found字样,则将cron改为crond再次执行
  • 没安装就安装: apt install cron
  • 编辑定时任务: crontab -e
  • 添加一行来增加定时执行一条命令(也可能需要按a才能进入编辑模式): 0 0 */7 * * sh /home/backup.sh,意思是每7天执行一次sh /home/backup.sh这个命令,命令编写请往下看参数说明。
  • 保存编辑: Ctrl+O,出现FIile name to Write...,输入回车(Enter)。(也可能需要按Ctrl+C退出编辑模式,按Shift+W+Q退出编辑)
  • 退出: Ctrl+X(也可能需要按esc,然后:wq保存并退出),提示crontab:installing new crontab表示任务设定成功
  • 到这里就完成了设定定时任务的一个流程
    注意: 在 crontab 命令中只有绝对路径,不存在相对路径,故执行任何命令都需要写绝对路径

常用命令

  • 查看定时任务: crontab -l
  • 列出xxx用户的所有调度任务: crontab -l -u xxx
  • 编辑定时任务: crontab -e
  • 删除所有的定时任务: crontab -r
  • 开启crontab服务: service cron start
  • 停止crontab服务: service cron stop
  • 查看crontab服务状态: service cron status
  • 重启crontab服务: service cron restart
  • 重新载入crontab任务: service cron reload
  • 强制重新载入crontab服务: service cron force-reload

参数说明

官方文档: https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html
crontab定时任务命令格式: <Minute> <Hour> <Day> <Month> <DayOfWeek> 要执行的命令
image.png
如图,参数说明:

  • Minute: 每个小时的第几分钟执行该任务,星号代表每分钟都执行
  • Hour: 每天的第几个小时执行该任务,星号代表每小时
  • Day: 每月的第几天执行该任务,星号代表每天都执行
  • Month: 每年的第几个月执行该任务,星号代表每个月都执行
  • DayOfWeek: 每周的第几天执行该任务,星号代表每周中的每一天都执行

模板

  • 每五分钟执行一次命令: */5 * * * * 命令
  • 每小时执行一次命令: 0 * * * * 命令,即分钟为0时执行一次命令
  • 每2小时执行一次命令: 0 */2 * * * 命令
  • 每天执行命令: 0 0 * * * 命令,即分钟为0,小时为0时执行一次命令
  • 每周1执行命令: 0 0 * * 1 命令,即分钟为0,小时为0,星期为1时执行一次命令。注意: 0 表示星期天, 1 表示星期一,以此类推;也可以用英文来表示,sun 表示星期天,mon 表示星期一等。
  • 每月执行命令: 0 0 1 * * 命令,即分钟为0,小时为0,每月中的第1天时执行一次命令
  • 每年执行命令: 0 0 1 1 * 命令,即分钟为0,小时为0,月份中的第1天,月份为1时执行一次命令

注意: 在 crontab 命令中只有绝对路径,不存在相对路径,故执行任何命令都需要写绝对路径

参数中的符号

  • 星号(*): 代表所有可能的值,例如Month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  • 逗号(,): 可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
  • 中杠(-): 可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
  • 正斜线(/): 可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

案例:

  • * * * * * touch /home/a.txt: 每分钟执行一次命令touch /home/a.txt
  • */5 * * * * touch /home/a.txt: 每5分钟执行一次命令touch /home/a.txt
  • * 3 * * * touch /home/a.txt: 每天凌晨3点时,每分钟执行一次命令touch /home/a.txt
  • 30 3 * * * touch /home/a.txt: 每天凌晨3点的30分时,执行一次命令touch /home/a.txt
  • 5 * * * * ls: 每小时的第5分钟执行 ls 命令
  • 30 4 * * * ls: 每天的 4:30 执行 ls 命令
  • 0 * * * * ls: 每小时的第0分钟执行 ls 命令
  • 0 0 * * * ls: 每天的0点0分执行 ls 命令
  • 0 0 * * 0 ls: 每周的0点0分执行 ls 命令
  • 0 0 1 1 * ls: 每年的1月1号0点0分执行 ls 命令
  • * * * * * touch /home/a.txt: 每分钟执行一次touch /home/a.txt
  • 3,15 * * * * touch /home/a.txt: 每小时的第3和第15分钟执行一次touch /home/a.txt
  • 3,15 8-11 * * * touch /home/a.txt: 在上午8点到11点的第3和第15分钟执行一次touch /home/a.txt
  • 3,15 8-11 */2 * * touch /home/a.txt: 每两天的上午8点到11点的第3和第15分钟执行一次touch /home/a.txt
  • 3,15 8-11 * * 1 touch /home/a.txt: 每个星期一的上午8点到11点的第3和第15分钟执行一次touch /home/a.txt
  • 30 6 * * 0 ls: 每星期日的 6:30 执行 ls 命令。
  • 20 7 8 * * ls: 每月 8号 的 7:20 执行 ls 命令
  • 30 5 28 6 * ls: 每年的 6月28号 5:30 执行 ls 命令
  • 30 4 10,20 * * ls: 每月 10号和20号 的 4:30 执行 ls 命令,注意: " , " 用来连接多个不连续的时间
  • 25 8-11 * * * ls: 每天 8~11点 的第 25 分钟执行 ls 命令,注意: " - " 用来连接连续的时间
  • 30 5 */10 * * ls: 每个月中每隔 10天 的 5:30 执行 ls 命令,即: 每月的 1、11、21、31日 在 5:30 执行一次 ls 命令
  • 30 4 * * * root run-parts /etc/cron.daily每天 4:30 以 root 身份执行 /etc/cron.daily 目录中的所有可执行文件
  • 30 21 * * * /etc/init.d/smb restart: 每晚的21:30重启smb
  • 45 4 1,10,22 * * /etc/init.d/smb restart: 每月1、10、22日的4 : 45重启smb
  • 10 1 * * 6,0 /etc/init.d/smb restart: 每周六、周日的1 : 10重启smb
  • 0,30 18-23 * * * /etc/init.d/smb restart: 每天18 : 00至23 : 00之间每隔30分钟重启smb
  • 0 23 * * 6 /etc/init.d/smb restart: 每星期六的晚上11 : 00 pm重启smb
  • * */1 * * * /etc/init.d/smb restart: 每一小时重启smb
  • * 23-7/1 * * * /etc/init.d/smb restart: 晚上11点到早上7点之间,每隔一小时重启smb
  • 0 11 4 * mon-wed /etc/init.d/smb restart: 每月的4号与每周一到周三的11点重启smb
  • 0 4 1 jan * /etc/init.d/smb restart: 一月一号的4点重启smb

真实使用中,一般都是执行自己的可执行文件。但也可以直接执行命令,比如:
0 * * * * cd /data/sync-data/mdd;/data/GoProjects/bin/go-elastic-index -config=mdd.toml >> mdd.log 2>&1
上面的命令意思是每小时执行一次,首先通过 cd 命令进入到指定绝对目录下(cd /data/sync-data/mdd),之后使用绝对路径找到可执行文件(/data/GoProjects/bin/go-elastic-index)正常执行即可。对应的 mdd.toml 和 mdd.log 都是在 cd 到的目录下(cd /data/sync-data/mdd),此时就不需要全部写全目录了,如果不使用 cd 命令的写法如下:
0 * * * * /data/GoProjects/bin/go-elastic-index -config=/data/sync-data/mdd/mdd.toml >> /data/sync-data/mdd/mdd.log 2>&1

使用Linux定时任务的案例: Linux定时备份

Q.E.D.


做一个热爱生活的人