• Linux之定时任务crond


    定时任务说明与分类

    定时任务的应用场景举例

    每天晚上 12点备份/etc/目录

    tar

    定时任务的三种分类

    crond(crontab)定时任务软件(软件包cronie),用的最多的一种

    atd,应用在只运行一次的任务

    anacron ,非7*24小时运行的服务器(比如开机多长时间运行,关机多长时间运行)

    [root@Dao ~]# rpm -qa cronie  查看安装的cronie软件版本
    cronie-1.4.4-16.el6_8.2.x86_64
    [root@Dao ~]# rpm -ql cronie   查看软件包详细列表
    /etc/cron.d
    /etc/cron.d/0hourly
    /etc/cron.deny
    /etc/pam.d/crond
    /etc/rc.d/init.d/crond    # crond定时软件
    /etc/sysconfig/crond
    /usr/bin/crontab
    /usr/sbin/crond
    /usr/share/doc/cronie-1.4.4
    /usr/share/doc/cronie-1.4.4/AUTHORS
    /usr/share/doc/cronie-1.4.4/COPYING
    /usr/share/doc/cronie-1.4.4/ChangeLog
    /usr/share/doc/cronie-1.4.4/INSTALL
    /usr/share/doc/cronie-1.4.4/README
    /usr/share/man/man1/crontab.1.gz
    /usr/share/man/man5/crontab.5.gz
    /usr/share/man/man8/cron.8.gz
    /usr/share/man/man8/crond.8.gz
    /var/spool/cron
    View Code

    用户与系统定时任务

    系统定时任务

    系统定时任务主要和四个文件有关(cron.daily、cron.hourly、cron.monthly、cron.weekly)

    系统会定时自动运行文件里面的内容

    [root@Dao ~]# ls -l /etc/ |grep cron.
    -rw-------   1 root root    541 Aug 24  2016 anacrontab
    drwxr-xr-x.  2 root root   4096 Jan 24 21:32 cron.d
    drwxr-xr-x.  2 root root   4096 Sep 27  2011 cron.daily  # 每天
    -rw-------   1 root root      0 Aug 24  2016 cron.deny
    drwxr-xr-x.  2 root root   4096 Jan 24 21:32 cron.hourly # 每小时
    drwxr-xr-x   2 root root   4096 Sep 27  2011 cron.monthly # 每月
    -rw-r--r--   1 root root    457 Sep 27  2011 crontab # 系统定时任务的配置文件之一
    drwxr-xr-x   2 root root   4096 Sep 27  2011 cron.weekly # 每周
    
    #有些病毒会在文件中插入定时任务,自动运行,所以很难彻底清除

    系统定时任务相关:系统定时任务+logrotate命令 完成对 日志的日志切割、日志轮询

    定时对这几个文件进行切割
    /var/log/cron /var/log/secure /var/log/messages

    查看日志目录下的日志文件

    [root@Dao ~]# ls -l /var/log/secure* /var/log/messages*
    -rw------- 1 root root  1498 Jan 24 21:32 /var/log/messages
    -rw------- 1 root root   438 Dec 12 12:27 /var/log/messages-20181216
    -rw------- 1 root root   141 Dec 16 03:29 /var/log/messages-20181223
    -rw------- 1 root root   141 Dec 23 03:14 /var/log/messages-20181230
    -rw------- 1 root root   206 Jan  3 12:40 /var/log/messages-20190106
    -rw------- 1 root root 45504 Jan 29 21:13 /var/log/secure
    -rw------- 1 root root 40715 Dec 16 01:10 /var/log/secure-20181216
    -rw------- 1 root root 49052 Dec 23 02:34 /var/log/secure-20181223
    -rw------- 1 root root 22145 Dec 30 03:08 /var/log/secure-20181230
    -rw------- 1 root root 33336 Jan  5 23:38 /var/log/secure-20190106

    logrotate里面的内容

    [root@Dao ~]# cat /etc/cron.daily/logrotate 
    #!/bin/sh
    
    /usr/sbin/logrotate /etc/logrotate.conf
    EXITVALUE=$?
    if [ $EXITVALUE != 0 ]; then
        /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
    fi
    exit 0
    [root@Dao ~]# cat /etc/logrotate.d/syslog 
    /var/log/cron
    /var/log/maillog
    /var/log/messages
    /var/log/secure
    /var/log/spooler
    {
        sharedscripts
        postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        endscript
    }

    用户的定时任务

    使用的几个命令

    crontab -l (list)     #查看用户的定时任务(列表)cron table
    crontab -e (edit)    #编辑用户的定时任务
    /var/spool/cron/root   #(root是用户名 root用户的定时任务)用户定时任务存放的目录

    第一次用的时候回提示

    [root@Dao ~]# crontab -l
    no crontab for root   #用户没有定时任务

    注:Linux中,每个用户的定时任务是分开的

    在定时任务中添加项目

    [root@Dao ~]# crontab -e   编辑定时任务
    # 和vim的操作是一样的,我写入了# pizza然后保存退出
    no crontab for root - using an empty one
    crontab: installing new crontab
    [root@Dao ~]# crontab -l
    # pizza

    定时任务的使用

    在使用之前,一定要确保定时任务依赖的软件(服务)是否可以使用

    # 查看定时任务是否在运行
    # 第一种方法
    [root@Dao ~]# /etc/init.d/crond status 
    crond is stopped
    # 第二种方法
    [root@Dao ~]# ps -ef |grep crond
    root     17714 17688  0 22:01 pts/0    00:00:00 grep crond
    # 查看定时任务,是不是开机自启动,要保证重启后也在运行
    [root@Dao ~]# chkconfig |grep crond
    crond              0:off    1:off    2:on    3:on    4:on    5:on    6:off
    # 3 位置是on就是开机自启动了

    定时任务的开启和关闭

    [root@Dao ~]# /etc/init.d/crond start
    Starting crond:                                            [  OK  ]
    [root@Dao ~]# /etc/init.d/crond status
    crond (pid  17733) is running...
    [root@Dao ~]# /etc/init.d/crond stop
    Stopping crond:                                            [  OK  ]
    [root@Dao ~]# /etc/init.d/crond status
    crond is stopped

    定时任务的开机启动关闭和开启

    [root@Dao ~]# chkconfig crond off
    [root@Dao ~]# chkconfig |grep crond
    crond              0:off    1:off    2:off    3:off    4:off    5:off    6:off
    [root@Dao ~]# chkconfig crond on
    crond              0:off    1:off    2:on    3:on    4:on    5:on    6:off

    如何用crontab?

    [root@Dao ~]# crontab --help
    crontab: invalid option -- '-'
    crontab: usage error: unrecognized option
    usage:    crontab [-u user] file
        crontab [-u user] [ -e | -l | -r ]
            (default operation is replace, per 1003.2)
        -e    (edit user's crontab) #查看列表  就相当于在查看/var/spool/cron/root
        -l    (list user's crontab) #编辑  就相当于在编辑 /var/spool/cron/root
        -r    (delete user's crontab)  #把当前都删掉,无提示,直接删
        -i    (prompt before deleting user's crontab) #删除之前提示
        -s    (selinux context)  

    为什么使用crontab命令,而不是直接操作/var/spool/cron/root这个文件呢?

    1、命令有语法检查功能,
    2、更方便

    定时任务相关的文件

    /var/spool/cron/  # 定时任务的配置文件所在目录
    /var/log/cron     # 定时任务的日志文件 运行过程的一个记录,无法显示运行的对不对
    /etc/cron.deny    # 哪些用户禁止使用定时任务 - 定时任务黑名单

    关于如何看日志

    定时任务格式与常见写法

    格式说明

    什么时间做什么事情

    时间分为5个部分-----分时日月周,事情就是命令或者脚本

    两个例子

    定时任务常用符号

    *     #
    /n    #隔     */10 *  *  *  * 表示每隔10分钟
    -     #从哪到哪  07-08#分隔   17,18,21

    例子

    题目:每5分钟同步一下系统的时间

    #第一个里程碑-命令
    ntpdate ntp1.aliyun.com
    #注意:编写定时任务要使用命令的绝对路径
    /usr/sbin/ntpdate ntp1.aliyun.com
    #第二个里程碑-写入定时任务
    crontab -e
    #在文件中写入
    # sync time by pizza at 20190123 00:15
    */5 * * * *  /usr/sbin/ntpdate ntp1.aliyun.com
    #第三个里程碑-检查
    ##1)看日志
    tail -f /var/log/cron
    ##2)看结果
    查看时间是否在跟新(可以先手动更改)

    注:You have mail in /var/spool/mail/root
    在修改时间时,会出现这句话。下面会说到

    题目:每天的上午7点到11点,每一个小时运行cmd命令

    # 注意:在写小时的时候,一定要加上00,否则就表示没分钟
    * 07-11 * * * CMD     # 表示没分钟都运行
    00 07-11 * * * CMD    # 表示每个小时都运行

    题目:每分钟把自己的名字 追加到/oldboy/oldboy.txt

    依照上面的流程:命令----写入----检查

    * * * * * echo `whoami` >> /oldboy/oldboy.txt

    定时任务的书写流程总结

    #1、命令行测试
    #2、把命令放入脚本中(命令多的时候)
    #3、测试脚本是否可以使用
    #4、写定时任务
    #5、检查结果

    定时任务九句箴言

    01、定时任务命令之前要加一行注释

    注:注释中写清楚备注信息,谁在什么时间做什么

    02、在写定时任务的时候,使用脚本替代命令

    注:超过两条命令都使用脚本

    题目:每分钟显示当前系统的时间(年-月-日),追加到/tmp/time.log中

    ##01、命令
    [root@learn-Linux001 ~]# date +%F
    2019-01-30
    ##02、脚本
    [root@learn-Linux001 ~]# mkdir -p /server/scripts
    将脚本都放在/server/scripts目录下
    [root@learn-Linux001 ~]# vim /server/scripts/date.sh
    创建脚本,写入命令
    [root@learn-Linux001 ~]# sh /server/scripts/date.sh
    2019-01-30
    因为创建的文件没有执行权限(默认644),所以我们使用sh来执行
    [root@learn-Linux001 ~]# sh /server/scripts/date.sh >>/tmp/date.log
    [root@learn-Linux001 ~]# cat /tmp/date.log
    2019-01-30
    测试脚本,成功
    ##03、脚本写入定时任务
    # print date to file by pizza at 20190128 18:50
    * * * * * /bin/sh  /server/scripts/date.sh >>/tmp/date.log
    使用命令的绝对路径
    ##04、检查(看日志,看结果)
    tail -f /etc/log/cron
    tail -f /tmp/date.log

    03、定时任务中date命令%百分号

    当我们在定时任务中,直接使用命令获取时间,得到的结果为空

    通过查看日志,发现,执行的命令是date +

    因为,%后面的内容内忽略了,如果一定要使用,可以带上撬棍()

    * * * * * date +\%F-\%T >> /tmp/time.txt >&1

    04、运行脚本一定要使用/bin/sh

    在创建脚本的时候,以sh为后缀

    05、把命令或者脚本的结果定向到文件中

    定时任务中,命令或者脚本结果(正确或错误)定向到黑洞(>/dev/null 2>&1)或追加到文件中(>> /tmp/oldboy.txt 2>&1)

    否则,就会导致故障

    企业案例

    如果没有上面所说的操作,很容易导致硬盘inode空间被占满,从而导致系统服务不正常

    定时任务中,命令或者脚本的结果,没有定向到空或者文件中,系统会发邮件
    #1、邮件的软件没有开启------大量的小文件堆积在/var/spool/postfix/maildrop/  ---inode满了
    #2、邮件软件开启了------定时任务会不断的给root用户发邮件
    you  have  new  mail  in  /var/spool/mail/root
    
    #查看邮件服务开启没有?
    [root@learn-Linux001 ~]# /etc/init.d/postfix status
    master (pid  1592) is running...

    06、避免不必要的程序及命令输出

    tar  zcf

    tar  zcvf    不可取

    07、创建压缩包使用相对路径

    切到目标目录的上一级打包目标

    [root@learn-Linux001 ~]# cd /
    [root@learn-Linux001 /]# tar zcf /tmp/ser-$(date +%F).tar etc/services 
    或者
    cd / && tar zcf /tmp/ser-$(date +%F).tar etc/services 

    08、定时任务脚本中的程序文件,尽量使用绝对路径

    否则,可能会出现找不到命令的错误

    因为,定时任务运行脚本的时候可以识别的PATH只有 /usr/bin 和 /bin

    解决方法:
    
    #1、使用绝对路径  /sbin/ifconfig
    #2、在脚本开头重新定义一下PATH
    ##  export  PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

    用户的定时任务,默认要存放在当前用户的家目录

    系统的定时任务,默认要存放在根目录下

    09、系统与命令位置有关的环境变量问题

    01)、定时任务运行脚本的时候可以识别的PATH只有 /usr/bin 和 /bin

    02)、java环境变量故障案例

    linux定时任务生产java服务无法执行问题案例http://oldboy.blog.51cto.com/2561410/1541515

    补充:删除大量堆积小文件

    创建环境

    [root@learn-Linux001 oldboy]# touch {1..500000}.txt
    -bash: /bin/touch: Argument list too long  # 数量太多,无法运行,使用下面的方法
    [root@learn-Linux001 oldboy]# echo {1..500000}.txt|xargs touch

    最后导致no space left on device

    [root@learn-Linux001 ~]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda3       6.9G  1.5G  5.1G  22% /
    tmpfs           926M     0  926M   0% /dev/shm
    /dev/sda1       190M   35M  146M  19% /boot
    [root@learn-Linux001 ~]# df -hi
    Filesystem     Inodes IUsed IFree IUse% Mounted on
    /dev/sda3        452K  452K     0  100% /
    tmpfs            232K     1  232K    1% /dev/shm
    /dev/sda1         50K    38   50K    1% /boot

    是因为inode满了

    [root@learn-Linux001 ~]# cd /oldboy/
    [root@learn-Linux001 oldboy]# rm -f *  
    -bash: /bin/rm: Argument list too long   直接删除失败
    [root@learn-Linux001 oldboy]# ls |xargs rm -f 
    [root@learn-Linux001 oldboy]# ll
    total 0
    这样删除,成功(删除小文件)
    可能会遇到更多的文件,这样也不能删除
    解决办法是,筛选后进行批量删除

    定时任务总结

     待...

  • 相关阅读:
    Git回退---reset和revert
    XML解析
    SpringBoot学习day01
    Spring boot精要
    JS没有contains方法,可以用indexof实现
    git fetch 取回所有分支(branch)的更新(转)
    idea 设置注释模板
    git退出编辑模式
    git 提交代码到远程分支
    linux下,保存退出vim编辑器(转)
  • 原文地址:https://www.cnblogs.com/yxiaodao/p/10317464.html
Copyright © 2020-2023  润新知