zoukankan      html  css  js  c++  java
  • 定时任务 Crontab命令 详解

    定时任务 Crontab命令 详解

    一、Crontab 格式说明

    我们可以用 crontab -e 添加要执行的命令。 命令执行的结果,无论是标准输出还是错误输出,都将以邮件形式发给用户。

    添加的命令必须以如下格式:

     * * * * * /command path

    前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,即命令字段,其中包括了crontab调度执行的命令。 各个字段之间用spaces和tabs分割。

    前5个字段分别表示:

    分钟:0-59
    小时:1-23
    日期:1-31
    月份:1-12
    星期:0-6(0表示周日)

    还可以用一些特殊符号:

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

    一些示例:

    00 8,12,16 * * * /data/app/scripts/monitor/df.sh
    30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh
    10 8,12,16 * * * /data/app/scripts/monitor/check_ind_unusable.sh
    10 8,12,16 * * * /data/app/scripts/monitor/check_maxfilesize.sh
    10 8,12,16 * * * /data/app/scripts/monitor/check_objectsize.sh

    43 21 * * *              21:43 执行
    15 05 * * *              05:15 执行
    0 17 * * *               17:00 执行
    0 17 * * 1               每周一的 17:00 执行
    0,10 17 * * 0,2,3        每周日,周二,周三的 17:00和 17:10 执行
    0-10 17 1 * *            毎月1日从 17:00到7:10 毎隔1分钟 执行
    0 0 1,15 * 1             毎月1日和 15日和 一日的 0:00 执行
    42 4 1 * *               毎月1日的 4:42分 执行
    0 21 * * 1-6             周一到周六 21:00 执行
    0,10,20,30,40,50 * * * *  每隔10分 执行
    */10 * * * *              每隔10分 执行
    * 1 * * *                 从1:0到1:59 每隔1分钟 执行
    0 1 * * *                 1:00 执行
    0 */1 * * *               毎时0分 每隔1小时 执行
    0 * * * *                 毎时0分 每隔1小时 执行
    2 8-20/3 * * *            8:02,11:02,14:02,17:02,20:02 执行
    30 5 1,15 * *             1日 和 15日的 5:30 执行

    二、& 后台执行命令

    当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。

    如:

    1 30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh &

    在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。

    不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:

    如:

    1 command >out.file 2>&1 &

    在这个例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。

    三、2>&1 含义

    先看一个例子:

    1 0 2 * * * /u01/test.sh >/dev/null 2>&1 &

    这句话的意思就是在后台执行这条命令,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null 文件,也就是清空。

    在这里有有几个数字的意思:

    0表示 键盘输入
    1表示 标准输出
    2表示 错误输出

    我们也可以这样写:

    0 2 * * *  /u01/test.sh  1>/u01/out.file  &
    0 2 * * *  /u01/test.sh  2>/u01/out.file  &
    0 2 * * *  /u01/test.sh  2>/u01/out.file  2>&1 &

    将tesh.sh 命令输出重定向到out.file, 即输出内容不打印到屏幕上,而是输出到out.file文件中。

    2>&1 是将错误输出重定向到标准输出。 然后将标准输入重定向到文件out.file。

    &1 表示的是文件描述1,表示标准输出,如果这里少了&就成了数字1,就表示重定向到文件1。

    & :后台执行

    测试:

    ls 2>1 : 不会报没有2文件的错误,但会输出一个空的文件1;
    ls xxx 2>1: 没有xxx这个文件的错误输出到了1中;
    ls xxx 2>&1: 不会生成1这个文件了,不过错误跑到标准输出了;
    ls xxx >out.txt 2>&1 == ls xxx 1>out.txt 2>&1:  因为重定向符号>默认是1,这句就把错误输出和标准输出都传到out.txt 文件中。

    四、2>&1写在后面的原因

    格式:command > file 2>&1   ==  command  1> file 2>&1

    首先是command > file将标准输出重定向到file中, 2>&1 是标准错误拷贝了标准输出,也就是同样被重定向到file中,最终结果就是标准输出和错误都被重定向到file中。

    如果改成: command 2>&1 >file

    2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。

      


    经验教训:

    打算在服务器上 每天晚上23:00 定时执行Python脚本,去备份MySql数据库,命令如下:

    1 * 23 * * * python /var/www/html/crontab_python/back_db.py >/dev/null 2>&1

    结果呢,每次备份都产生了 60份 备份文件,仔细查看定时任务命令,发现在“分”的位置上,少加了个“0”,因为“*”表示该位置的任何一个值,修改如下:

    1 0 23 * * * python /var/www/html/crontab_python/back_db.py >/dev/null 2>&1

    0 4 * * * /usr/local/php/bin/php /usr/local/nginx/www/backup-db/backup_db.php 172.16.8.26 >/dev/null 2>&1
    0 4 * * * /usr/local/php/bin/php /usr/local/nginx/www/backup-db/backup_db.php 172.16.10.151 >/dev/null 2>&1

    每天一小步,人生一大步!Good luck~
  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    微信小程序TodoList
    C语言88案例-找出数列中的最大值和最小值
    C语言88案例-使用指针的指针输出字符串
  • 原文地址:https://www.cnblogs.com/jkmiao/p/4893891.html
Copyright © 2011-2022 走看看