• 定时任务


    ## 定时任务分类
    #### 定时任务分为三类
        crond:定时任务软件(cronie软件包)
        atd:只运行一次
        anacron:非7*24运行的服务器
    ## 用户定时与系统定时任务
    #### 系统定时任务文件:如系统中毒后需清理以下文件内容
        /etc/cron.hourly:系统每小时运行的程序
        /etc/cron.daily:系统每天运行的程序
        /etc/cron.weekly:系统每周运行的程序
        /etc/cron.monthly:系统每运行的程序
        /etc/cron.deny:定时任务黑名单
        /etc/crontab 定时任务配置之一
        /系统定时任务+logrotate命令完成日志的日志切割与日志询
    #### 用户定时任务
        crontab -l:查看用户的定时任务
        crontab -e:编辑用户的定时任务
        /var/spool/cron/root(root用户的定时任务)
    #### 查看crond服务是否运行
            方法一:
            [root@web02 ~]# /etc/init.d/crond status
            crond (pid  1581) is running...
            方法二:
            [root@web02 ~]# ps -ef |grep crond
            root       1581      1  0 15:58 ?        00:00:01 crond
            root       2175   2024  0 23:27 pts/1    00:00:00 grep --color=auto crond
            方法三:是否开机运行
            [root@web02 scrpits]# chkconfig |grep crond
            crond 0:off    1:off    2:on    3:on    4:on    5:on    6:off

    #### 定时任务的常见写法
    ```
      # Example of job definition:
      # .---------------- minute (0 - 59)
      # | .------------- hour (0 - 23)
      # | | .---------- day of month (1 - 31)
      # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
      # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
      # | | | | |
      # *  *  *  *  *  command to be executed
        分 时 日 月 周 命令
    ```
    ##### 定时任务中的特殊符号
        *:每,如* * * * * 命令
        /n:每隔,如*/5 * * * * 每隔五分钟运行一次
        -:从哪里到哪里,如07-08,每天上午的7点到8点
        ,:分隔,如00 07,09,11 * * * ,每天7点9点11点整点运行一次
        注:如想表示整点,分钟必须写上00,如:* 07-11 * * * 表示的是每天7点到11点之前每分钟运行一次,00 07-11 * * *表示的是每天7点到11点整每个小时运行一次
    #### 定时任务的文件说明
    | 文件 | 说明 |
    | --- | --- |
    | /etc/cron.deny | 该文件列出的用户不能使用crontab命令 |
    | /etc/cron.allow | 该文件列出的用户允许使用crontab命令,优先于/etc/cron.deny |
    | /var/spool/cron | 所有用户crontab配置文件默认都存放在此目录,文件名以用户名命名。1. 定时任务的配置文件,定时任务规则2. 文件名就是用户名(root) |
    #### crontab命令
    | 参数 | 含义 | 指定示例 |
    | --- | --- | --- |
    | -l(小写L) | 查看crontab文件内容 | crontab -l |
    | -e | 编辑crontab文件内容 | crontab -e |
    | -i | 删除crontab文件内容,删除前会提示确认 | crontab -ri |
    | -r | 删除crontab文件内容 | crontab -r |
    | -u user | 指定使用的用户执行任务。 | crontab -u luffy -l |

    强调:-i -r基本不用。尽量只用-e
    crontab -e 实际操作/var/spool/cron里的文件(以用户名命名)
    crontab优点:
    1.  检查语法
    2.  输入方便

    #### 定时任务的八大要领
        要领1:为定时任务罪责加必要的注释
        要领2:执行shell脚本任务前加/bin/sh
        要领3:定时任务命令或脚本的结尾加 >/dev/null(表示黑洞) 2>&1(正确或错误都输出到文件)
        要领4:定时任务命令或程序最好写到脚本里执行 
        要领5:在指定用户下执行相关定时任务 
        要领6:生产任务程序不要随意打印输出信息 tar zcf 
        要领7:定时任务执行的脚本要规范路径(全路径) 
        要领8:配置定时任务规范操作过程,防止出错

    #### 定时任务的书写流程
        1.先在命令行中使用命令测试
        2.将命令放入脚本中
        3.测试脚本是否可以使用
        4.写定时任务:(先测试每分钟执行,测试无问题后改为要求的时间)
        5.测试结果:1.查看定时任务日志2.查看命令是否执行成功
    #### 定时任务PATH环境变量问题
    ##### 定时任务运行脚本只识别/bin,/usr/bin,找不到路径会报command not found
        解决方法:
        1.命令使用绝对路径,如ifconfig的绝对路径是/sbin/ifconfig
        2.在脚本开头重新定义一下PATH:如export  PATH=/usr/local/python3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:

    #### 例子1:系统每五分钟更新一下时间
        [root@web02 ~]# crontab -l
        #update system time automatically every 2 minutes
        */2 * * * * /usr/sbin/ntpdate pool.ntp.org
        [root@web02 ~]# date
        Thu Jan 17 02:35:05 CST 2019
        [root@web02 ~]# date
        Fri Jan 18 10:52:48 CST 2019
        You have new mail in /var/spool/mail/root

    #### 例子2:每分钟把自己的名字追加到/tmp/name.txt中
        [root@web02 ~]# crontab -l
        #print name to file
        * * * * * echo 'oldboy' >> /tmp/name.txt
        You have new mail in /var/spool/mail/root
        [root@web02 ~]# tail -f /tmp/name.txt
        oldboy
        oldboy
        oldboy
        oldboy
        oldboy
    ####例子3:每分钟显示当前系统时间追加到/tmp/time.log中
        #print time to file
        * * * * * date +\%F >> /tmp/time.log #%前面加了转义符,是在定时任务里面不认识%,或者使用脚本
        #脚本
        * * * * * /bin/sh /server/scrpits/time.sh >> /tmp/time.log
        #检查
        [root@web02 ~]# tail -f /var/log/cron
        Jan 18 14:46:01 web02 CROND[5537]: (root) CMD (/bin/sh /server/scrpits/time.sh >> /tmp/time.log)
        [root@web02 ~]# tail -f /tmp/time.log 2019-01-18

    #### 例子4:定时任务规则中如没有定向到空或者文件中的会很容易导致硬盘inode空间被占满,从而系统服务不正常(一般定时规则后面需要加/dev/null 2>&1)
        #没有定向到空,邮件软件服务开启--定时任务会一直给root用户发送邮件
        You have new mail in /var/spool/mail/root
        ##邮件服务没有开启----大量的小文件会堆积在/var/spool/postfix/maildrop/ 倒致inode满了
        [root@web02 ~]# /etc/init.d/postfix stop
        Shutting down postfix:                                     [  OK  ]
        You have new mail in /var/spool/mail/root
        [root@web02 ~]# ll /var/spool/postfix/maildrop/
        total 4
        -rwxr--r--. 1 root postdrop 502 Jan 18 14:55 6C4CE3F8E9
        #加完>/dev/null 2>&1 后,屏幕上不会提示You have new mail in /var/spool/mail/root

    #### 例子5:如何删除大量的小文件
        #环境准备,创建50万小文件
        #直接创建多文件也是会报错的
        [root@web02 maildrop]# touch {1..500000}.txt 
        -bash: /bin/touch: Argument list too long
        #换一种创建方式
        [root@web02 maildrop]# echo {1..500000}.txt |xargs touch
        #无法创建文件,查看磁盘空间与inode号,发现inodek号满了
        [root@web02 maildrop]# touch 123
        touch: cannot touch `123': No space left on device
        [root@web02 maildrop]# df -h
        Filesystem      Size  Used Avail Use% Mounted on
        /dev/sda2       7.6G  2.2G  5.1G  30% /
        tmpfs           931M     0  931M   0% /dev/shm
        /dev/sda1       190M   40M  141M  22% /boot
        [root@web02 maildrop]# df -i
        Filesystem     Inodes  IUsed  IFree IUse% Mounted on
        /dev/sda2      512064 512064      0  100% /
        tmpfs          238282      1 238281    1% /dev/shm
        /dev/sda1       51200     39  51161    1% /boot
        #查找文件中的小文件,查看两个目录的小文件,发现maildrop这个目录下有40多万的小文件
        [root@web02 maildrop]# find / -type d -size +1M |xargs ls -hld
        dr-xr-x---. 9 root    root     1.1M Jan 18 15:06 /root
        drwx-wx---. 2 postfix postdrop  13M Jan 18 15:09 /var/spool/postfix/maildrop
        [root@web02 maildrop]# ls /var/spool/postfix/maildrop/ |wc -l
        440166
        [root@web02 maildrop]# ls /root |wc -l
        16
        #删除小文件,发现现在直接删除所有的小文件会报错,这是因为rm不能直接删除大量的小文件,需要换一种方式
        [root@web02 maildrop]# rm -f *
        -bash: /bin/rm: Argument list too long
        [root@web02 maildrop]# ls |xargs rm -f #使用这一种方式
        [root@web02 maildrop]# ls -l
        total 0
        
        #另外一种方式删除小文件所在的目录,但是要注意要先把目录的所有者和权限需要先记住,后面新建的时候进行还原
        
        
        
  • 相关阅读:
    python脚本
    python引用,浅拷贝,深拷贝
    postgresql MVCC详解
    sql排它锁
    sqlalchemy使用
    ASP.Net MVC开发基础学习笔记(7):数据查询页面
    js timestamp与datetime之间的相互转换
    聊聊iOS中TCP / UDP 协议
    IOS -执行时 (消息传递 )
    Java对象的序列化和反序列化
  • 原文地址:https://www.cnblogs.com/yjiu1990/p/10288705.html
Copyright © 2020-2023  润新知