• 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
    这样删除,成功(删除小文件)
    可能会遇到更多的文件,这样也不能删除
    解决办法是,筛选后进行批量删除

    定时任务总结

     待...

  • 相关阅读:
    java ee / video / rtsp / rtmp / fuck douyin / fuck douyincdn / fuck amemv.com
    6步 实现 mysql8.0 MGR架构
    使用redis zset 数据结构进行分数排名
    First Look at Some of the GTK4 Apps in GNOME 42
    Introducing LibadwaitaGTK 3 (and libhandy) to GTK 4 and libadwaita for GNOME 41 GNOME 42
    Send same packets to multiple clients
    LeetCode 207. Course Schedule
    LeetCode 210. Course Schedule II
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode 797. All Paths From Source to Target
  • 原文地址:https://www.cnblogs.com/yxiaodao/p/10317464.html
Copyright © 2020-2023  润新知