zoukankan      html  css  js  c++  java
  • 定时任务之crontab命令

    简介

    crontab用于设置周期性被执行的命令
    Linux系统中Linux调动工作分为两大类:
      1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
      2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置
    /etc/crtontab
      系统调度的任务一般存放在/etc/crontab这个文件下,里面存放了一些系统运行的调度程序,通过命令cat crontab查看
      这些任务会在系统运行起来自动调用
    /var/spool/cron
      每个用户都会生成自动生成一个自己的crontab文件,一般位于/var/spool/cron目录下
      执行命令crontab -r 就会删除当前用户的crontab文件。例如你切换到suifeng账号下,执行了该命令,那么/var/spool/cron/suifeng文件就会删除,如果要创建该文件只需要用crontab -e命令即可。
      注意,普通用户一般没有权限访问/var/spool/cron
    /etc/crontab.deny文件与/etc/crontab.allow文件
      1、分别表示不能使用crontab命令的用户、以及能够使用crontab命令的用户
      2、两个文件同时存在crontab.allow文件优先
      3、两个文件都不存在则只有root用户才拥有调用该命令
     

    语法

    crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ]

    各个参数说明

    1. -e [UserName]: 执行文字编辑器来设定时程表,内定的文字编辑器是 vi(可以指定别的用户,但是必须拥有权限)
    2. -r [UserName]: 删除目前的时程表
    3. -l [UserName]: 列出目前的时程表
    4. -v [UserName]:列出用户cron作业的状态

    创建定时任务

      crontab -e进入文本(vi)编辑状态
      * * * * * command path  // 前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,即命令字段,其中包括了crontab调度执行的命令。 各个字段之间用spaces和tabs分割。
    (可将命令写入.sh脚本文件中,并赋予可执行的权限即可)

    调度命令的规则

    字段名称 说明 取值范围
    分钟 每小时的第几分钟执行 0-59
    小时 每日的第几个小时执行 0-23
    日期 每月的第几天执行 1-31
    月历 每年的第几月执行 1-12
    星期 每周的第几天执行 0-6
    命令名称 欲执行的命令及参数  

    crontab命令中的一些常用特殊符号

    符号 说明
    * 表示任何时刻
    , 表示分割
    表示一个段,如第二段里: 1-5,就表示1到5点
    /n 表示每个n的单位执行一次,如第二段里,*/1, 就表示每隔1个小时执行一次命令。也可以写成1-23/1.

    查看定时任务

    crontab -l

    删除定时任务

    crontab -r
     

    使用示例

    实例1:每1分钟执行一次command
      * * * * * command
    实例2:每小时的第3和第15分钟执行
    3,15 * * * * command
    实例3:在上午8点到11点的第3和第15分钟执行
    3,15 8-11 * * * command
    实例4:每隔两天的上午8点到11点的第3和第15分钟执行
    3,15 8-11 */2 * * command
    实例5:每个星期一的上午8点到11点的第3和第15分钟执行
    3,15 8-11 * * 1 command
    实例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 
    * */1 * * * /etc/init.d/smb restart
    实例12:晚上11点到早上7点之间,每隔一小时重启smb 
    * 23-7/1 * * * /etc/init.d/smb restart
    实例13:每月的4号与每周一到周三的11点重启smb 
    0 11 4 * mon-wed /etc/init.d/smb restart
    实例14:一月一号的4点重启smb 
    0 4 1 jan * /etc/init.d/smb restart
    实例15:每小时执行/etc/cron.hourly目录内的脚本
    01 * * * * root run-parts /etc/cron.hourly
    # run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名
    实例16:
      1、每天23点59分后台执行test.sh脚本;并将标准输出写入log.txt中
      59 23 * * * /home/suifeng/scripts/test.sh >/home/suifeng/log.txt &
      2、同上
      59 23 * * * /home/suifeng/scripts/test.sh 1>/home/suifeng/log.txt &
      3、每天23点59分后台执行test.sh脚本;并将错误输出写书log.txt中
      59 23 * * * /home/suifeng/scripts/test.sh 1>/home/suifeng/log.txt &
      4、每天23点59分后台执行test.sh脚本;并将错误输错当做标准输出(即将错误输出和标准输出全部写入log.txt中)
      59 23 * * * /home/suifeng/scripts/test.sh 1>/home/suifeng/log.txt 2>&1 &

    相关说明

      0表示键盘输入
      1表示标准输出
      2表示错误输出
      &表示后台执行
      >>表示追加
      >表示覆盖写

    注意

      1、当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。
      2、需要用户交互的命令不要放在后台执行,因为那样子机器将会在那一直等待
      3、作业在后台运行时,一样会将结果输出在屏幕上,干扰你的正常工作。因此我们最好将输出重定向到某个文件中
     

    crond服务

    通过 chkconfig --list | grep cron 命令来查看cron服务的启动情况:
    [root@***** home]# chkconfig --list | grep cron crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
    我们可以看到,系统启动级别如果是1-4,cron服务都会开机自动启动的,我们可以通过如下命令来设置该服务的启动项:
      /sbin/service crond start
      /sbin/service crond stop
      /sbin/service crond restart
      /sbin/service crond reload
    以上1-4行分别为启动、停止、重启服务和重新加载配置。
    要把cron设为在开机的时候自动启动,在 /etc/rc.d/rc.local 脚本中加入 /sbin/service crond start 即可。
    查看crontab服务状态:
    service crond status
     

    操作实例

    1.首先,新建需要定时执行的shell脚本,这里我为了方便说明问题,新建了一个打印当前时间的脚本date.sh,内容如下,非常简单,就是一行date命令,然后将输出重定向到一个date.txt文本中:

    2.接着就是将这个date.sh脚本添加到定时任务中,直接运行“crontab -e”命令添加就行,如下,这里先以每分钟执行一次脚本为例,看定时任务能否正常执行,编辑“*/1 * * * * /root/date.sh”保存就行,如下:

    至于这6个字段的含义,官方文档有详细说明,如下,分别代表分、时、天、月、星期和执行的命令,网上介绍资料也非常丰富,感兴趣的话,可以搜索一下:

    3.最后,我们再查看一下输出文件date.txt和crontab日志,如下,说明添加的定时任务已经正常运行,这里再替换成你每天定时执行的时间,只需要修改第一、二个字段就行,例如,每天10:30执行,则编辑“30 10 * * * /root/date.sh”保存就行:

    至此,我们就完成了每天定时执行shell脚本。总的来说,整个过程非常简单,只要你有一定的Linux基础,熟悉一下crontab命令,很快就能掌握的,网上也有相关资料和教程,介绍的非常详细,感兴趣的话,可以搜一下,希望以上分享的内容能对你有所帮助吧,也欢迎大家评论、留言进行补充。

     

    个人经验总结

      我们使用这个命令大多都是运行相关的脚本文件,最常见的就是定时调用http请求进行数据采集或者数据库的备份等等。因此当我们自己所写的脚本文件中含有文件引入时,最好采用绝对路径,否则将会引入失败从而导致定时任务失败。
     
     
     
  • 相关阅读:
    nginx的优化
    apache日志轮询技术
    PV IP UV的概念介绍
    日志文件记录的重要性
    linux chmod 755
    ssh免密码登录机器(使用公钥和秘钥进行加密来实现)
    ffmpeg基础
    linux使用grep和find查找内容
    为什么我们会越来越穷?
    从我干程序员开始 我就不准备干这个行业
  • 原文地址:https://www.cnblogs.com/diandianquanquan/p/11518977.html
Copyright © 2011-2022 走看看