Linux 定时任务cron

jefxff 153,628 2020-07-14

1. cron是什么

cron是一个linux下的定时执行工具,也是Linux的内置的守护进程(daemon), 可以在无需人工干预的情况下来重复运行某些被设定好了确定的运行时间的任务(如: mysql自动备份, 每周重启Web服务等等...)
注意: 首先需要将cron设置为开机启动, 因为重启或者服务器关机之后, 如果没有启动cron服务的话, 定时任务不会执行, (腾讯云cron是默认开机启动的, 因为腾讯云有执行腾讯云监控等任务)
cron在线测试工具: https://tool.lu/crontab/


2. cron命令语法

语法

# 语法格式: 语法主要是由时间设定和命令设定两部分组成
M H D m d [options] filePath/Commond

#------------- 字符含义 -------------
# M: 分钟 	       范围: 0 ~ 59
# H: 小时	       范围: 0 ~ 23
# D: 月份内的某天   范围: 1 ~ 31 
# m: 月份	       范围: 1 ~ 12
# d: 星期内的某天   范围: 0 ~ 7
# 命令: 就是需要执行的命令, 可以是一条命令, 也可以是指向一个脚本的绝对路径


#------------- 特殊字符 -------------
# "*": "*"代表所有的取值范围内的数字
# "/": "/"代表每的意思,"*/5"表示每5个单位
# "-": "-"代表从某个数字到某个数字
# ",": ","代表分开几个离散的数字

图解
timg

实例

# 每天早上8点写一句 Hello World
0 8 * * * echo "Hello World" >> /root/temp.txt

# 早上8点, 12-13点, 晚上20-23点 执行命令
0 8,12-13,20-23 * * * ping www.baidu.com

# 每个月1号0点执行某个重启任务
0 0 1 * * /usr/bin/***.sh

# 每个两天的凌晨0-1点执行任务
0 0-1 */2 * * /usr/bin/***.sh

# 每周一重启一次halo博客
0 0 * * 0 ./root/myhalo.sh

# 每天晚上8电备份一次MySQL数据库
0 20 * * * ./root/backup/mysql_backup.sh

# 每分钟执行 
*/1 * * * *

# 每小时执行   
0 * * * *

# 每天执行     
0 0 * * *

# 每周执行     
0 0 * * 0

# 每月执行     
0 0 1 * *

# 每年执行     
0 0 1 1 *

3. 通过 crontab 来执行定时任务

cron可以让系统在指定的时间,去执行某个指定的工作,可以使用crontab指令来管理cron机制

3.1crontab 命令参数说明

使用方式:
 crontab [options] file
 crontab [options]
 crontab -n [hostname]

Options:
 -u <user>  定义用户
 -e         编辑用户的crontab
 -l         列出用户的crontab
 -r         删除用户的crontab
 -i         删除前提示
  • 设置开机自启

    systemctl enable crond.service
    
  • 查看服务状态

    systemctl status crond
    
  • 启动

    systemctl start crond
    
  • 停止

    systemctl stop crond
    
  • 重启

    systemctl restart crond
    
  • 重新加载

    systemctl reload crond
    

3.2 cron 执行日志

crontab 的执行日志在 /var/log/cron 中, 可以通过cat 命令或tail 命令来查看


4. 定时任务实例

4.1 定时任务 --- 每周重启halo博客

halo博客我是用Caddy代理的, 前段时间发生了奇妙事件, 突然就挂掉了, 因此就想通过crontab来做一个定时任务, 每周重启一次halo

  • 命令
# 执行这条命令打开定时任务编辑(默认是采用vim编辑的)
crontab -e

# cron命令
0 0 * * 0 /root/myhalo.sh restart

4.2 定时任务 --- 每天备份MySQL数据库

  • 编写MySQL备份脚本

    #! /bin/bash
    # filePath = "/root/MysqlBackUp.sh"
    
    name = $(data"+%Y-%m-%d %H:%M:%S")
    db_name = "mysql"
    # MySQL备份
    mysqldump --defaults-extra-file=/etc/my.cnf mysql > /usr/"$db_name"-"$name.sql"
    
  • 命令

    # 首先赋予MysqlBackUp.sh可执行的权限
    chmod +x MysqlBackUp.sh
    
    # 执行这条命令打开定时任务编辑(默认是采用vim编辑的)
    crontab -e
    
    # cron 命令: 每天晚上20点执行MySQL备份命令
    0 20 * * * /root/MysqlBackUp.sh
    

# linux # cron