zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Insus Meta Utility
    The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
    Insus Binary Utility
    asp.net实现文件下载功能
    Column 'Column Name' does not belong to table Table
    程序已被编译为DLL,怎样去修改程序功能
    如何在Web网站实现搜索功能
    如何把数据流转换为二进制字符串
    Asp.net更新文件夹的文件
    如何显示中文月份
  • 原文地址:https://www.cnblogs.com/zlqblog/p/7189909.html
Copyright © 2011-2022 走看看