• crontab 定时任务


    通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。

    crond服务

    路径 描述
    /var/spool/cron/ 由 crontab -e 进行写入,配置文件无需指定用户
    /etc/crontab 只能root 进行编辑,配置文件需指定用户
    /etc/cron.d/ 配置同 /etc/crontab 需指定用户
    /var/log/cron crond 服务日志位置
    /etc/cron.deny 黑名单模式,默认为空.即在此文件内的用户,禁止使用crond服务

    扩展知识: crontab文件详解

    crontab 定时任务基本语法

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  *   command to be executed
    
    • 字符含义:
    字符 含义
    * 任何时刻,放在分钟位置上就表示每分钟。放在小时位置就表示每小时。
    , 分割时段,比如要在3点和6点都执行,就可以写 3,6
    - 表示一个区间,比如要1点到5点的20分都执行任务,20 1-5 * * * command
    /n n代表的是数字,表示每隔 n 个时间执行一次。 比如要每2分钟执行任务,*/2 * * * * command

    在线验证 crontab 语法的网站

    命令格式

    • 命令:

    crontab [-u user] file crontab [-u user] [ -e | -l | -r ]

    • -u user:用来设定某个用户的crontab服务
    • file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
    • -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
    • -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
    • -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
    • -i:在删除用户的crontab文件时给确认提示。

    常用命令

    命令 描述
    crontab -l 查看当前的 crontab 任务
    crontab -e 编辑 crontab 任务,不符合规则的任务会报错。
    crontab -u username -l 帮助其他用户查看 crontab 任务,只有 root 用户才可以使用。
    crontab -u username -e 帮助其他用户编辑 crontab 任务,只有 root 用户才可以使用。
    crontab -r 删除所有的 crontab 任务
    systemctl status crond 查看 crond 服务状态
    systemctl start/stop/reload crond crond 服务启动/暂停/重启

    实例[crontab -e (/var/spool/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 * * * /etc/init.d/smb restart

    实例[/etc/crontab 用法]

    /etc/crontab 的语法格式和 crontab -e 大致相同,前者需要指定用户,后者不需要。

    • vim /etc/crontab
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root # 指的就是当有 stdout 和 stderr 时,发送mail 给谁,默认是root,我们可以指定我们的e-mail账号,但是前提要在本地配置好邮件发送账号
    *  *  *  *  * user-name  command to be executed
    # 实例11:每一小时重启smb
    # `0 */1 * * * root /etc/init.d/smb restart`
    

    实例[/etc/cron.d/ 用法]

    在 /etc/cron.d/下创建一个文件,文件配置和/etc/crontab 是一样的,需要指定用户。
    注意点:

    • 创建的文件不要带任何后缀,例如 vim /etc/cron.d/smb_restart
    • Linux下的 crontab 正常会每分钟自动读取 /etc/crontab 文件和 /etc/cron.d/ 目录下的所有文件,所以如果想立即生效,请手动执行 systemctl restart crond 来使任务马上生效.
    • 星期与月日互斥,请不要同时设置两者.
    # vim /etc/cron.d/smb_restart
    # 实例11:每一小时重启smb
    # `0 */1 * * * root /etc/init.d/smb restart`
    

    FAQ

    1.手动执行没问题,但crontab报错不执行?

    • 很大概率是环境变量的锅,可尝试手动引入环境变量来解决.
    #直接引用
    0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
    #调用的脚本引用
    cat start_cbp.sh
    !/bin/sh
    source /etc/profile
    export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
    /usr/local/jboss-4.0.5/bin/run.sh -c mev &
    
    • 注意脚本中涉及文件路径的地方,全部写绝对路径!!!

    2.注意清理系统用户的邮件日志

    每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。 例如,可以在crontab文件中设置如下形式,忽略日志输出:

    0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

    • /dev/null 2>&1 表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

    3.crontab里的 % 字符转义

    %在crontab里是特殊字符,具体含义:

    * * * * * cat >> /tmp/cat_line.txt 2>&1 % stdin input 1 % stdin input 2 % stdin input 3
    #输出内容如下:
    $ cat /tmp/cat_line.txt
    stdin input 1
    stdin input 2
    stdin input 3
    

    因此,我们可以知道第一个%表示标准输入的开始,其余%表示换行符.
    然后,我们可以通过 来进行转义.

    Reference link

  • 相关阅读:
    What is the difference between google tag manager and google analytics?
    GetService<IMessageBoxService>() returned null.
    Using Google Consent Mode to Adjust Tag Behavior Based on Consent
    what are the values in _ga cookie?
    DEP019 System table or view is deprecated
    How to set the Google Analytics cookie only after another consent cookie is set and "true"?
    Tag Manager and gtag.js
    Using the OptanonWrapper Callback Function
    elk7.15.1版本收集nginx日志并用kibana图形化分析日志
    ELK分析Nginx日志和可视化展示
  • 原文地址:https://www.cnblogs.com/jonnyan/p/14346574.html
Copyright © 2020-2023  润新知