• LInux Crontab及命令


    定时任务(cron job)被用于安排那些需要被周期性执行的命令。利用它,你可以配置某些命令或者脚本,让它们在某个设定的时间内周期性地运行。cron 是 Linux 或者类 Unix 系统中最为实用的工具之一。cron 服务(守护进程)在系统后台运行,并且会持续地检查 /etc/crontab 文件和 /etc/cron.*/目录。它同样也会检查 /var/spool/cron/ 目录。

    crontab 命令

    crontab 是用来安装、卸载或者列出定时任务列表的命令。cron 配置文件则用于驱动 Vixie Cron 的 cron(8) 守护进程。每个用户都可以拥有自己的 crontab 文件,虽然这些文件都位于 /var/spool/cron/crontabs 目录中,但并不意味着你可以直接编辑它们。你需要通过 crontab 命令来编辑或者配置你自己的定时任务。

    定时配置文件的类型

    配置文件分为以下不同的类型:
    UNIX 或 Linux 的系统级 crontab : 此类型通常由那些需要 root 或类似权限的系统服务和重要任务使用。第六个字段(见下方的字段介绍)为用户名,用来指定此命令以哪个用户身份来执行。如此一来,系统的 crontab 就能够以任意用户的身份来执行操作。
    用户的 crontab: 用户可以使用 crontab 命令来安装属于他们自己的定时任务。 第六个字段为需要运行的命令, 所有的命令都会以创建该 crontab 任务的用户的身份运行。

    注意: 这种问答形式的 Cron 实现由 Paul Vixie 编写而成,并且被包含在许多 Linux 发行版本和类 Unix 系统(如广受欢迎的第四版 BSD)中。它的语法被各种 crond 的实现所兼容。

    那么我该如何安装、创建或者编辑我自己的定时任务呢?
    创建crontab 文件

    crontab文件是通过crontab命令得到的。现在假设有个用户名为foxy,需要创建自己的一个crontab文件。首先可以使用任何文本编辑器建立一个新文件,然后向其中写入需要运行的命令和要定期执行的时间。
      然后存盘退出。假设该文件为/tmp/test.cron。再后就是使用crontab命令来安装这个文件,使之成为该用户的crontab文件。键入:
      crontab test.cron
      这样一个crontab 文件就建立好了。可以转到/var/spool/cron目录下面查看,发现多了一个foxy文件。这个文件就是所需的crontab 文件。用more命令查看该文件的内容可以发现文件头有三行信息:
      #DO NOT EDIT THIS FILE -edit the master and reinstall.
      #(test.cron installed on Mon Feb 22 14:20:20 1999)
      #(cron version --$Id:crontab.c,v 2.13 1994/01/17 03:20:37 vivie Exp $)
      大概意思是:
      #切勿编辑此文件——如果需要改变请编辑源文件然后重新安装。
      #test.cron文件安装时间:14:20:20 02/22/1999
      如果需要改变其中的命令内容时,还是需要重新编辑原来的文件,然后再使用crontab命令安装。
      可以使用crontab命令的用户是有限制的。如果/etc/cron.allow文件存在,那么只有其中列出的用户才能使用该命令;如果该文件不存在但cron.deny文件存在,那么只有未列在该文件中的用户才能使用crontab命令;如果两个文件都不存在,那就取决于一些参数的设置,可能是只允许超级用户使用该命令,也可能是所有用户都可以使用该命令。

      crontab命令的语法格式如下:
      crontab [-u user] file
      crontab [-u user]{-l|-r|-e}
      第一种格式用于安装一个新的crontab 文件,安装 分file所指的文件,如果使用“-”符号作为文件名,那就意味着使用标准输入作为安装来源。
      -u 如果使用该选项,也就是指定了是哪个具体用户的crontab 文件将被修改。如果不指定该选项,crontab 将默认是*作者本人的crontab ,也就是执行该crontab 命令的用户的crontab 文件将被修改。但是请注意,如果使用了su命令再使用crontab 命令很可能就会出现混乱的情况。所以如果是使用了su命令,最好使用-u选项来指定究竟是哪个用户的crontab文件。

    crontab 命令

    cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:

    crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
    crontab -l //列出某个用户cron服务的详细内容
    crontab -r //删除某个用户的cron服务
    crontab -e //编辑某个用户的cron服务(按 X 删除光标所选字符,按 I 在所选位置插入,dd 删除当前行,P 粘贴)
    :wq! +enter  保存退出

    :q!+enter 不保存退出
    比如说root查看自己的cron设置:crontab -u root -l
    再例如,root想删除fred的cron设置:crontab -u fred -r
    在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
    进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
    要编辑你的 crontab 文件,需要在 Linux 或 Unix 的 shell 提示符后键入以下命令:
    $ crontab -e
    crontab 语法(字段介绍)

    语法为:
    1 2 3 4 5 /path/to/command arg1 arg2

    或者
    1 2 3 4 5 /root/ntp_sync.sh

    其中:
    第1个字段:分钟 (0-59)
    第2个字段:小时 (0-23)
    第3个字段:日期 (0-31)
    第4个字段:月份 (0-12 [12 代表 December])
    第5个字段:一周当中的某天 (0-7 [7 或 0 代表星期天])
    /path/to/command – 计划执行的脚本或命令的名称

    便于记忆的格式:
    * * * * * 要执行的命令
    ----------------
    | | | | |
    | | | | ---- 周当中的某天 (0 - 7) (周日为 0 或 7)
    | | | ------ 月份 (1 - 12)
    | | -------- 一月当中的某天 (1 - 31)
    | ---------- 小时 (0 - 23)
    ------------ 分钟 (0 - 59)

    简单的 crontab 示例:
    ### 每隔 5 分钟运行一次 backupscript 脚本 ##
    */5 * * * * /root/backupscript.sh

    ### 每天的凌晨 1 点运行 backupscript 脚本 ##
    0 1 * * * /root/backupscript.sh

    ### 每月的第一个凌晨 3:15 运行 backupscript 脚本 ##
    15 3 1 * * /root/backupscript.sh

    如何使用操作符

    操作符允许你为一个字段指定多个值,这里有三个操作符可供使用:
    星号 (*) : 此操作符为字段指定所有可用的值。举个例子,在小时字段中,一个星号等同于每个小时;在月份字段中,一个星号则等同于每月。
    逗号 (,) : 这个操作符指定了一个包含多个值的列表,例如:1,5,10,15,20,25.
    横杠 (-) : 此操作符指定了一个值的范围,例如:5-15 ,等同于使用逗号操作符键入的 5,6,7,8,9,…,13,14,15。
    分隔符 (/) : 此操作符指定了一个步进值,例如: 0-23/ 可以用于小时字段来指定某个命令每小时被执行一次。步进值也可以跟在星号操作符后边,如果你希望命令行每 2 小时执行一次,则可以使用 */2。

    如何禁用邮件输出

    默认情况下,某个命令或者脚本的输出内容(如果有的话)会发送到你的本地邮箱账户中。若想停止接收 crontab 发送的邮件,需要添加 >/dev/null 2>&1 这段内容到执行的命令的后面,例如:
    0 3 * * * /root/backup.sh >/dev/null 2>&1

    如果想将输出内容发送到特定的邮件账户中,比如说 vivek@nixcraft.in 这个邮箱, 则你需要像下面这样定义一个 MAILTO 变量:
    MAILTO="vivek@nixcraft.in"
    0 3 * * * /root/backup.sh >/dev/null 2>&1

    访问 “禁用 Crontab 命令的邮件提示” 查看更多信息。

    任务:列出你所有的定时任务

    键入以下命令:
    # crontab -l
    # crontab -u username -l

    要删除所有的定时任务,可以使用如下命令:
    ### 删除当前定时任务
    crontab -r
    ### 删除某用户名下的定时任务,此命令需以 root 用户身份执行
    crontab -r -u username

    使用特殊字符串来节省时间
    你可以使用以下 8 个特殊字符串中的其中一个替代头五个字段,这样不但可以节省你的时间,还可以提高可读性。
    特殊字符
    含义
    @reboot 在每次启动时运行一次
    @yearly 每年运行一次,等同于 “0 0 1 1 *”.
    @annually (同 @yearly)
    @monthly 每月运行一次, 等同于 “0 0 1 * *”.
    @weekly 每周运行一次, 等同于 “0 0 * * 0”.
    @daily 每天运行一次, 等同于 “0 0 * * *”.
    @midnight (同 @daily)
    @hourly 每小时运行一次, 等同于 “0 * * * *”.

    示例:

    每小时运行一次 ntpdate 命令
    @hourly /path/to/ntpdate

    关于 /etc/crontab 文件和 /etc/cron.d/* 目录的更多内容

    /etc/crontab 是系统的 crontab 文件。通常只被 root 用户或守护进程用于配置系统级别的任务。每个单独的用户必须像上面介绍的那样使用 crontab 命令来安装和编辑自己的任务。/var/spool/cron/ 或者 /var/cron/tabs/ 目录存放了个人用户的 crontab 文件,它应该备份在用户的家目录当中。

    理解默认的 /etc/crontab 文件:
    1、这个格式的前一部分是对时间的设定,后面一部分是要执行的命令,如果要执行的命令太多,可以把这些命令写到一个脚本里面,然后在这里直接调用这个脚本就可以了,调用的时候记得写出命令的完整路径。时间的设定我们有一定的约定,前面五个*号代表五个数字,数字的取值范围和含义如下:


    分钟 (0-59)
     小時 (0-23)
     日期 (1-31)
     月份 (1-12)
     星期 (0-6)//0代表星期天

    除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"*/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。以下举几个例子说明问题:

    每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。


    2、典型的 /etc/crontab 文件内容是这样的:
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    HOME=/
    # run-parts
    01 * * * * root run-parts /etc/cron.hourly
    02 4 * * * root run-parts /etc/cron.daily
    22 4 * * 0 root run-parts /etc/cron.weekly
    42 4 1 * * root run-parts /etc/cron.monthly

    首先,环境变量必须被定义。如果 SHELL 行被忽略,cron 会使用默认的 sh shell。如果 PATH 变量被忽略,就没有默认的搜索路径,所有的文件都需要使用绝对路径来定位。如果 HOME 变量被忽略,cron 会使用调用者(用户)的家目录替代。

    另外,cron 会读取 /etc/cron.d/目录中的文件。通常情况下,像 sa-update 或者 sysstat 这样的系统守护进程会将他们的定时任务存放在此处。作为 root 用户或者超级用户,你可以使用以下目录来配置你的定时任务。你可以直接将脚本放到这里。run-parts命令会通过 /etc/crontab 文件来运行位于某个目录中的脚本或者程序。


    /etc/cron.d/ 将所有的脚本文件放在此处,并从 /etc/crontab 文件中调用它们。
    /etc/cron.daily/ 运行需要 每天 运行一次的脚本
    /etc/cron.hourly/ 运行需要 每小时 运行一次的脚本
    /etc/cron.monthly/ 运行需要 每月 运行一次的脚本
    /etc/cron.weekly/ 运行需要 每周 运行一次的脚本

    备份定时任务
    # crontab -l > /path/to/file

    # crontab -u user -l > /path/to/file

    例子:

    *  *  *  *  *  command
    分  时  日  月  周  命令


    第1列表示分钟1~59 每分钟用*或者 */1表示
     第2列表示小时1~23(0表示0点)
     第3列表示日期1~31
    第4列表示月份1~12
    第5列标识号星期0~6(0表示星期天)
     第6列要运行的命令

    crontab文件的一些例子:

    30 21 * * * /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每晚的21:30重启lighttpd 。

    45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每月1、10、22日的4 : 45重启lighttpd 。

    10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每周六、周日的1 : 10重启lighttpd 。

    0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启lighttpd 。

    0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
    上面的例子表示每星期六的11 : 00 pm重启lighttpd 。

    * */1 * * * /usr/local/etc/rc.d/lighttpd restart
    每一小时重启lighttpd

    * 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
    晚上11点到早上7点之间,每隔一小时重启lighttpd

    0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
    每月的4号与每周一到周三的11点重启lighttpd

    0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
    一月一号的4点重启lighttpd

  • 相关阅读:
    TP框架模板中IF Else 如何使用?
    Append 后如何使用 fadein淡入效果
    ThinkPad如何修改fn键默认操作
    TP框架ajax U方法不解析怎么办?
    thinkphp session如何取数组
    FTP服务搭建
    Linux系统学习之字符处理
    如何使用zabbix初级监控
    项目同步部署
    巡检常用命令
  • 原文地址:https://www.cnblogs.com/zlqblog/p/7189909.html
Copyright © 2020-2023  润新知