Linux关于定时任务设置

定时任务是实现重复的工作,让系统自动完成,
设置定时任务的方法
方法一:使用 cronie 软件可以设置定时任务
方法二:使用atd软件可以说设置定时任务 和闹钟类似,需要每次都设置
方法三:使用anacron 软件设置定时任务 设置时间不够灵活

anacron是系统自带的,在 /etc/cron* 开头的文件
1. /etc/cron.daily - - - 每天定时执行(24小时周期)
2. /etc/cron.hourly - - - 每小时执行
3. /etc/cron.monthly - - - 每月定时执行
4. /etc/cron.weekly - - - 每周定时执行

这里重点使用方法一:
cronie 这个软件就是软件包名,没有的话# yum install cronie 就可以下载了
编辑定时任务:# crontab -e 直接进入编辑,不过格式我们先看一下
格式在 /etc/crontab 文件中有写到
在这里插入图片描述
最主要的就是下面的那行带星号的

  • 第一个星号:表示分钟 (0-59)
  • 第二个星号:表示小时 (0-23)
  • 第三个星号:表示天数 (1-31)
  • 第四个星号:表示月份 (1-12)
  • 第五个星号:表示星期/周(1-7)(0-6 国外人习惯用这个方式,0表示星期天)
  • 后面写上需要操作的命令即可

定时任务的定点设置:
设置定时任务文件:# crontab -e - - - 进入编辑
图片中表示每天的凌晨2点就会备份这个文件

0 02 * * * cp /etc/hostname /etc/hostname.bak

定时任务可以精确到分钟
表示每天的凌晨2:30分会备份这个文件

30 02 * * * cp /etc/hostname /etc/hostname.bak

间接性定时任务
可以设置一个每隔多久时间的操作一次定时任务
表示每隔2隔小时操作一次后面的命令,但是这里的每隔2小时是整数倍执行,2点 4点 6点 以此类推的时间备份。不会3点,5点的时间备份

* */2 * * * cp /etc/hostname /etc/hostname.bak

时间段内执行定时任务
设置一个时间段内执行定时任务
表示8点到14点执行后面的命令

0 8-14 * * * cp /etc/hostname /etc/hostname.bak

指定时间多次执行定时任务
比如需要这个定时任务,需要9点,10点,12点各执行一次

0 9,10,12 * * * cp /etc/hostname /etc/hostname.bak

特殊时间表示方式

符号\作用作用
*表示每(每分钟,每天)
*/n隔多久
n-m连续时间范围
n,m不连续时间范围

检查操作
设置完定时任务后,可以修改时间查看一下效果,在哪里能看见效果呢,cron的日志文件。(虚拟机上改就算了,别再生产环境下搞这个,就算搞了多学学跑路技巧)

# tail -f /var/log/cron
Dec 26 15:01:02 mingbab CROND[15805]: (root) CMD (run-parts /etc/cron.hourly)
Dec 26 15:01:02 mingbab run-parts(/etc/cron.hourly)[15805]: starting 0anacron
Dec 26 15:01:02 mingbab run-parts(/etc/cron.hourly)[15814]: finished 0anacron
Dec 26 16:01:01 mingbab CROND[15831]: (root) CMD (run-parts /etc/cron.hourly)

使用这个命令就可以实时查看cron的日志文件
以空格做分割符号:
第一二三列:定时任务触发时间信息
第四列:定时任务执行主机名称
第五列:定时任务触发方式1. ROND:配置定时任务
2. anacron:系统默认定时任务
最后列:执行任务信息

定时任务配置规范

编写定时任务规范

  • 命令信息定时任务
    第一步:先测试任务命令的命令进行测试

    # cp /etc/hostname /etc/hostname.bak
    # ll /etc/hostname*	
    -rw-r--r-- 1 root root 8 Dec 11 10:11 /etc/hostname
    -rw-r--r-- 1 root root 8 Dec 26 16:44 /etc/hostname.bak
    

    第二步:之后再编写定时任务

    #crontab-e
    30 02 * * * cp /etc/hostname /etc/hostname.bak
    

    第三步:测试定时任务是否执行

    tail -f /var/log/cron
    
  • 脚本信息定时任务
    第一步:先写一个脚本文件

    vim test.sh
    cp /etc/hostname /etc/hostname.bak --- 这是内容
    

    第二步:测试检查脚本执行脚本

    # sh test.sh 
    # ll /etc/hostname*
    -rw-r--r-- 1 root root 8 Dec 11 10:11 /etc/hostname
    -rw-r--r-- 1 root root 8 Dec 26 16:58 /etc/hostname.bak
    

    第三步:写定时任务

    #crontab-e
    30 02 * * * sh /root/test.sh  #这个路径需要写绝对路径
    

    第四步:测试定时任务是否执行

    #tail -f /var/log/cron 
    

定时任务常见问题

  • 第一个:使用定时任务,内容携带命令时,要使用绝对路径
    先测试命令需要执行的命令

    #ntpdate ntp1.aliyun.com
    

    再编写定时任务

    #crontab -e
    */5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
    

    最后确认检查

    # tail -f /var/log/cron
    
  • 第二个:定时任务执行命令无法识别特殊的符号
    比如备份一个数据名称需要有时间的信息
    咱们先测试命令

    # cp /etc/hostname /etc/hostname_$(date "+%F")
    

    在编写定时任务信息

    #crontab -e
    * * * * * cp /etc/hosts  /backup/hosts_$(date "+%F")
    

    检查定时任务

    # crontab -e
    

    会在日志中看到这条信息:无法解析百分号

    Dec 26 19:30:01 mingbab CROND[16476]: (root) CMD (cp /etc/hosts /backup/hosts_$(date "+)
    

    定时任务编辑命令行特殊符号时不能识别
    解决办法:1.在无法解析的符号前添加 \ 反斜杠

    * * * * * cp /etc/hosts  /backup/hosts_$(date "+\%F")
    
    1. 或者使用脚本编辑定时任务,参考上面的步骤
  • 第三个:定时任务产生的输出信息会占用磁盘空间
    解决方法:可以将输出的信息重定向到系统黑洞中

    * * * * * cp /etc/hosts  /backup/hosts.bak  &>/dev/null
    * * * * * cp /etc/hosts  /backup/hosts.bak  >/dev/null 2>&1
    
  • 第四个:编写的定时任务最好都加上注释信息,让人知道这条定时任务是做什么的


版权声明:本文为Ming_Ba原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。