zoukankan      html  css  js  c++  java
  • crontab 系列

    crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序使用cron服务,用 service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它,cron服务是一个定时执行的服务,可以通过crontab 命令添加或者编辑需要定时执行的任务:

    也就是说:linux/unix系统如果想运行cron任务,得先启动crond服务;

    5)重启crond服务

    /etc/init.d/crond status  #查看当前运行状态

    /etc/init.d/crond restart #重启

    /etc/init.d/crond reload  #平滑重启

     或者 servie crond restart

    crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 eg: crontab -u root
    crontab -l //列出某个用户cron服务的详细内容 
    crontab -r //删除某个用户的cron服务 
    crontab -e //编辑某个用户的cron服务   //一般编辑当前登录用户,一个用户只有一个cor文件,并已用户名命名

    比如说root查看自己的cron设置:crontab -u root -l

    再例如,root想删除fred的cron设置:crontab -u fred -r

    在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e

    进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt

    编辑/etc/crontab文件,在末尾加上一行: 30 5 * * * root init 6 这样就将系统配置为了每天早上5点30自动重新启动。

    需要将crond设置为系统启动后自动启动的服务,可以在/etc/rc.d/rc.local 中,在末尾加上

    service crond start

    如果还需要在系统启动十加载其他服务,可以继续加上其他服务的启动命令。

    比如: service mysqld start

    基本用法: 
    1. crontab -l 
         列出当前的crontab任务 
    2. crontab -d 
         删除当前的crontab任务 
    3. crontab -e (solaris5.8上面是 crontab -r) 
         编辑一个crontab任务,ctrl_D结束 
    4. crontab filename 
         以filename做为crontab的任务列表文件并载入

    crontab file的格式: 
        crontab 文件中的行由 6 个字段组成,不同字段间用空格或 tab 键分隔。前 5 个字段指定命令要运行的时间 
           分钟 (0-59) 
           小时 (0-23) 
           日期 (1-31) 
           月份 (1-12) 
           星期几(0-6,其中 0 代表星期日) 
           第 6 个字段是一个要在适当时间执行的字符串 
    例子: 
          #MIN HOUR DAY MONTH DAYOFWEEK COMMAND 
          #每天早上6点10分 
          10 6 * * * date 
          #每两个小时 
          0 */2 * * * date    (solaris 5.8似乎不支持此种写法) 
          #晚上11点到早上8点之间每两个小时,早上8点 
          0 23-7/2,8 * * * date 
          #每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点 
          0 11 4 * mon-wed date 
          #1月份日早上4点 
          0 4 1 jan * date

    执行秒级任务:

    * * * * * /bin/date >>/tmp/date.txt
    * * * * * sleep 10/bin/date >>/tmp/date.txt
    * * * * * sleep 20/bin/date >>/tmp/date.txt
    * * * * * sleep 30/bin/date >>/tmp/date.txt
    * * * * * sleep 40/bin/date >>/tmp/date.txt
    * * * * * sleep 50/bin/date >>/tmp/date.txt# backup mysql
    %%执行:
    00 01 * * * mysqldump -u root --password=passwd-d mustang > /root/backups/mustang_$(date +%Y%m%d_%H%M%S).sql
    01 01 * * * mysqldump -u root --password=passwd-t mustang > /root/backups/mustang-table_$(date +%Y%m%d_%H%M%S).sql

    一、cron在3个地方查找配置文件:
    1、/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom建的crontab任务对应的文件就是/var/spool/cron/tom。
    一般一个用户最多只有一个crontab文件。

    二、/etc/crontab 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab。

    三、/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。

    四、权限
    crontab权限问题到/var/adm/cron/下一看,文件cron.allow和cron.deny是否存在
    用法如下: 
    1、如果两个文件都不存在,则只有root用户才能使用crontab命令。 
    2、如果cron.allow存在但cron.deny不存在,则只有列在cron.allow文件里的用户才能使用crontab命令,如果root用户也不在里面,则root用户也不能使用crontab。 
    3、如果cron.allow不存在, cron.deny存在,则只有列在cron.deny文件里面的用户不能使用crontab命令,其它用户都能使用。 
    4、如果两个文件都存在,则列在cron.allow文件中而且没有列在cron.deny中的用户可以使用crontab,如果两个文件中都有同一个用户,
    以cron.allow文件里面是否有该用户为准,如果cron.allow中有该用户,则可以使用crontab命令。

    或者:

    在/etc/cron.deny中添加要拒绝的用户名,格式如下:

    listen

    nobody

    noaccess

    username1

    username2

    username3

    .

    2)允许用户访问crontab任务

    在/etc/cron.allow中添加要允许的用户名,格式如下:

    root

    username1

    username2

    在crontab文件中如何输入需要执行的命令和时间。该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。
        每个域之间使用空格或者制表符分隔。格式如下: 
      minute hour day-of-month month-of-year day-of-week commands 
        合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) commands(代表要执行的脚本)
        除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。

    基本格式 :

    *****command

    分  时  日  月  周  命令

    第1列表示分钟1~59 每分钟用*或者 */1表示

    第2列表示小时1~23(0表示0点)

    第3列表示日期1~31

    第4列表示月份1~12

    第5列标识号星期0~6(0表示星期天)

    第6列要运行的命令

    1)拒绝用户使用crontab任务

    2)定期执行一个目录下的文件

    在/etc/crontab中添加目录,格式如下:

    01 * * * * root run-parts 目录

    注:使用run-parts可定义定期执行的目录

    4)限权测试

    1>添加用户

    [root@test ~]# useradd test

    [root@test ~]# echo 123456 |passwd test--stdin  #<==非交互模式创建密码

    Changing password for user test.

    passwd: all authentication tokensupdated successfully.

    2>拒绝测试

    [root@test ~]# cat /etc/cron.deny 

    test

    [root@test ~]# 

    [root@test ~]# su - test

    [test@test ~]$ crontab -e

    You (test)are not allowed to use this program (crontab)

    See crontab(1) for more information

    在cron.deny中加入用户后,该用户没有权限编辑定时任务

    3>允许测试

    [root@test ~]# cat /etc/cron.allow

    test

    [root@test ~]# su - test

    [test@test ~]$ crontab -e   #<==test用户编辑成功

    */1 * * * * echo successful >/tmp/a.log

    [test@test ~]$ crontab -l

    */1 * * * * echo successful >/tmp/a.log

    在cron.allow中加入用户后,该用户能编辑定时任务

    4>清空允许用户

    [test@test ~]$ su - root

    Password: 

    [root@test ~]# echo >/etc/cron.allow

    [root@test ~]# su - test

    [test@test ~]$ crontab -l  #<==test用户连查看的权限都没有

    You (test)are not allowed to use this program (crontab)

    See crontab(1) for more information

    [test@test ~]$ cat /etc/cron.deny

    test

    清空cron.allow允许用户后,该用户又被cron.deny拒绝,

    得出结论:/etc/cron.allow优先于/etc/cron.deny配置

    3Crontab用法

    [root@yang1 data]# crontab --help   #<==注:crontab –l –e都是直接操作/var/spool/cron/下当前用户名的文件

    usage: crontab [-u user] file    #<==指定某用户如crontab –u yang2 –e,编辑yang2家目录下的crontab

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

            (default operation is replace,per 1003.2)

        -e   (edit user's crontab)  #<==编辑当前用户的定时任务

        -l   (list user's crontab)  #<==查看当前用户的定时任务

        -r   (delete user's crontab)  #<==删除定时任务

        -i   (prompt before deletinguser's crontab) #<==删除crontab文件内容,删前会有提示

        -s   (selinux context)

    注:crontab –e 编辑定时任务,退出时可以检查语法,直接编辑/var/spool/cron/root不能。如果大批量添加任务,则使用echo追加。

    cron执行的每一项工作都会被纪录到/var/log/cron这个日志文件中,可以从这个文件查看命令执行的状态。

    4Crontab命令的书写格式

      *      *     *      *     *    /bin/sh /scripts/yy.sh

      分     时     日     月     周    命令和文件路径

    (00-59)  (0-23)   (1-31)   (1-12)    (0-6)         

     

    所用符号表示意思

    星号每的意思

    减号连续一段时间,如:00 17-19 * * * cmd  每天下午17点,18点,19点执行一次命令

    逗号多个时间段,如:00 10-11,17-19 * * * cmd 每天的上午10,11点整,下午的17,18,19点整执行一次命令

    /n n代表数字,指每隔n时间执行一次,如: */2 * * * * cmd 每隔2分钟执行一次命令

    1)举例:

    30 12-16/2 * ** cmd 

    每天的中午12点到下午4点间,每隔2小时执行一次

    其它如:小时上有值,则分钟上也要有值

    */1 * * ** echo yangrong >>/var/log/yy > /dev/null 2>&1

    每隔一分钟把yangrong打印到yangrong1文件中,但该命令无法执行,因为>>与>/dev/null不可同时使用

    2)/dev/null 2>&1解释

    0是标准输入    使用<或<<

    1是标准输出    使用>或>>

    2是标准错误输出  使用2>或2>>

    >/dev/null 2>&1  即错误输出与标准输出全部重定向到空,可以写成1>/dev/null 2>/dev/null

    3)关于重定向的作用

    重定向到空可以避免碎片文件占用inode资源

    重定向到一个指定log里,可以看任务是否执行

    4)关于导致磁盘inode满情况分析

    时任务执行成功or失败时,程序会向上层发送mail,由于平时工作中不打开sendmail功能,所以邮件会存储在临时目录/var/spool/clientmqueue,随着执行的任务次数多,文件也会越来越多,直到某一天,添加文件时,提示No space left on device,主要问题原因不在于垃圾文件会占很大空间,而在于每个文件会占用inode节点。(centos6.4默认不装sendmail,可能不会导致这个问题发生)。

    所以crontab规则后需加 /dev/null 2>&1。

    注:>> 与 >/dev/null 2>&1不可同时存在,不然无法执行

    5、定时服务器时间同步

    1)手动同步

    [root@yang1 data]# which ntpdate

    /sbin/ntpdate

    [root@yang1 data]# /sbin/ntpdate time.windows.com

    2)自动同步(使用定时任务)

    #sync systime by yangrong at 2013-9-4         

    */5 * * * * /sbin/ntpdate time.windows.com>/dev/null 2>&1

    注:当局域网内的服务器足够多时(500+),则需自己在局域网搭建ntp server

    6、写定时任务注意点:

    掌握了下面7点,写定时任务就不在犯错。

    序号

    注意点

    1

    每个任务添加注释,谁写的,什么时间写的,完成什么需求?

    2

    执行脚本使用/bin/sh(防止脚本无执行权限),要执行的文件路径是从根开始的绝对路径(防止找不到文件)

    3

    尽量把要执行的命令放在脚本里,然后把脚本放在定时任务里。对于调用脚本的定时任务,可以把标准输出错误输出重定向到空。

    4

    定时任务中带%无法执行,需要加转义

    5

    如果时上有值,分钟上必须有值

    6

    日和周不要同时使用,会冲突

    7

    >>与>/dev/null 2>&1不要同时存在

    书写举例:

    #backup mysql byyangrong at 2013-9-4

    30 4 * * * /bin/shtar_mysql.sh >/dev/null 2>&1 

    7、调试定时任务

    一个任务不能轻易的直接推上线上服务器,需要在测试服务器上测试好。

    序号

    调试方法

    1

    增加频率调试任务,如:生产环境2小时一次,测试机2分钟一次

    2

    加快时间调试任务,如:生产环境1天后执行,则添加任务后修改设备时间

    3

    重定向到一个日志里,查看任务执行情况。一个是定时任务后加log,一个是脚本后加log

    4

    环境变量可能导致问题

    5

    通过日志定位问题。  tail /var/log/cron

  • 相关阅读:
    SpringMVC(三) RESTful架构和文件上传下载
    SpringMVC(二) 参数绑定 与 JSON
    SpringMVC(一) 简单代码编写,注解,重定向与转发
    Spring深入浅出(三)XML方式以及注解的方式操作IOC
    Markdown 语法整理
    前端开发中一些好用的chrome插件汇总
    vue-cli项目配置mock数据
    HTTP协议详解
    JS判断IE6/IE7/IE8系列的写法
    ES6新特性(转)
  • 原文地址:https://www.cnblogs.com/cbugs/p/6188139.html
Copyright © 2011-2022 走看看