zoukankan      html  css  js  c++  java
  • crontab

    crontab(crond)是什么?

    crond是linux系统中用来 定期执行命令 或者 指定程序任务 的一种服务或者软件

    秒级任务:
    1.crond自身无能为力
    2.但是自己可以 写守护进程shell循环(while true;do),来实现秒级任务

    mkdir /etc/profile.d/server/scripts -p  #写到全局环境变量里面,防止脚本不加载
    cd /etc/profile.d/server/scripts
    
    [root@lb01 /etc/profile.d/server/scripts]# vim miao.sh
    #!/bin/bash   
    while true						#也可以写 while true;do
    do
    	echo oldboylinux >> /tmp/a.log
    	sleep 1
    done
    [root@lb01 /etc/profile.d/server/scripts]# sh miao.sh   #CTRL+c可以停止秒级任务的执行,&符可以把进程放到后台
    
    #过滤后台进程
    [root@lb01 ~]# ps -ef|grep miao.sh
    root      15020  14164  0 00:11 pts/1    00:00:00 sh miao.sh
    root      15154  13718  0 00:13 pts/0    00:00:00 grep --color=auto miao.sh
    [root@lb01 ~]# ps -ef|grep [m]iao.sh
    root      15020  14164  0 00:11 pts/1    00:00:00 sh miao.sh
    
    #追踪自定义日志
    [root@lb01 ~]# tail /tmp/a.log -f
    oldboylinux
    oldboylinux
    ...
    
    # 杀死后台进程
    kill + 进程号 
    pkill + 服务
    

    为什么需要定时任务:
    服务器:7*24小时开机提供服务是网站的基本特征
    备份重要数据(最好一天一次),服务器上的数据一般最低1天备份一次,每分钟(实时备份,一般半夜备份)(备份完成echo,或者发邮件),所以说需要定时任务

    linux定时任务分类:
    1.系统自身的定期执行的任务
    [root@lb01 ~]# ll /var/log/{messages,secure}
    -rw------- 1 root root 13806 Feb  2 00:20 /var/log/messages
    -rw------- 1 root root 11588 May  2  2020 /var/log/secure
    	
    2.手动设置的定时任务
    
    [root@oldboy ~]# yum provides crontab
    [root@oldboy ~]# yum provides crond   #结果一样,都可以下载相同的包
    [root@oldboy ~]# rpm -q cronie
    cronie-1.4.11-23.el7.x86_64
    [root@oldboy ~]# rpm -ql cronie
    /etc/cron.d
    /etc/cron.d/0hourly
    /etc/cron.deny
    /etc/pam.d/crond
    /etc/sysconfig/crond
    /usr/bin/crontab  #库文件
    /usr/lib/systemd/system/crond.service  #说明crontab可以使用systemctl来管理
    /usr/sbin/crond
    /var/spool/cron   #crontab -e 编辑的文本
    /var/log/cron  #crontab 的日志,判断定时任务是否执行成功,但是有些复杂的命令显示执行成功,但是实际上执行失败
    
    [root@lb01 ~]# ll /etc/systemd/system/multi-user.target.wants/crond.service   # 说明crontab是开机自启动的
    lrwxrwxrwx. 1 root root 37 May  1  2020 /etc/systemd/system/multi-user.target.wants/crond.service -> /usr/lib/systemd/system/crond.service
    
    [root@oldboy ~]# rpm -qc cronie  # 找不到/etc/crontab,该文件是crontab的配置文件
    /etc/cron.d/0hourly
    /etc/cron.deny
    /etc/pam.d/crond
    /etc/sysconfig/crond
    
    [root@lb01 ~]# which crontab
    /usr/bin/crontab
    [root@lb01 ~]# ll /usr/bin/crontab 
    -rwsr-xr-x. 1 root root 57656 Aug  9 07:07 /usr/bin/crontab
    
    #查看当前的运行级别
    [root@oldboy ~]# runlevel  
    N 3
    [root@oldboy ~]# ll /etc/systemd/system/default.target  
    lrwxrwxrwx 1 root root 41 Apr 26 06:59 /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target  
    
    
    [root@oldboy ~]# systemctl status crond   # 绿色,crond开机自启
    ● crond.service - Command Scheduler
    
    
     
    [root@oldboy ~]# curl -I http://10.0.0.8/  curl 自己的正在运行的源码nginx页面,200=可以正常打开,状态码不是200就不是正常状态,curl出来的状态码就是nginx页面上显示的状态码,企业可以用curl来检查网站的状态
    
    HTTP/1.1 200 OK       #
    Server: nginx/1.16.1
    Date: Sun, 26 Apr 2020 09:16:22 GMT
    Content-Type: text/html
    Content-Length: 661
    Last-Modified: Sun, 26 Apr 2020 09:02:00 GMT
    Connection: keep-alive
    ETag: "5ea54e08-295"
    Accept-Ranges: bytes
    
    #使用curl命令检查指定的网站运行情况
    vim /etc/profile.d/panduanwangzhan1.sh
    #!/bin/bash
    a=$(curl -s -I http://10.0.0.8/|awk 'NR==1{print $2}')
    if [ $a -eq 200 ];then
    	echo 网站正常运行 | /usr/bin/mail -s 'syy的网站运行情况报告' xxxxxx@qq.com >/dev/null
    else
    	echo 网站没了 | /usr/bin/mail -s 'syy的网站运行情况报告' xxxxxx@qq.com >/dev/null
    fi
    
    #编辑定时任务
    crontab -e
    ### 执行目的 执行时间 执行人
    00 6 * * * /usr/bin/sh /etc/prfile.d/panduanwangzhan.sh
    
    # 还可以根据端口判断网站运行状态
    vim /etc/profile.d/panduanwangzhan2.sh
    #!/bin/bash
    a=$(ps -ef|grep [n]ginx|wc -l)   
    if [ $a -gt 0 ];then
    	echo 网站正常运行 >/tmp/1.txt
    else
    	echo 网站没了 >/tmp/1.txt
    fi
    
    
    [root@oldboy ~]# curl -I http://10.0.0.8/|awk 'NR==1{print $2}' &>>/dev/null 
    #前3行内容既不是正确输出,又不是错误输出,curl -s 就不会显示这个烦人的输出了
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0   661    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
    200
    
    # loub 巡检报告脚本
    vim a.txt
    #!/bin/bash
    used=`df -h|awk 'NR==2{print $3}'`
    free=`df -h|awk 'NR==2{print $4}'`
    process_count=`ps -ef|grep [n]ginx|wc -l`
    prot=`netstat -lntup|grep 80|wc -l`
    status_code=`curl -I -m 10 -o /dev/null -s -w %{http_code} http://10.0.0.8`
    echo "-------------------------disk info( 磁盘信息) ---------------------------"
    echo "磁盘已使用:$used"
    echo "磁盘空闲:$free"
    echo "-------------------------nginx info( nginx信息) ---------------------------"
    echo "nginx的进程数:$process_count"
    echo "nginx的端口数:$prot"
    echo "nginx页面状态码:status_code"
    
    crontab -e
    ...
    
    # 日志切割
    [root@oldboy ~]# ll /bin/false 
    -rwxr-xr-x. 1 root root 28928 Aug 20  2019 /bin/false
    [root@oldboy ~]# file /bin/false 
    [root@oldboy ~]# /bin/false 
    
    [root@oldboy ~]# echo $?    这个文件不管有没有执行成功,echo $? 都不会是0
    1
    

    Crontab配置文件解析

    [root@zls ~]# vim /etc/crontab
    SHELL=/bin/bash                     #执行命令的解释器(不同的系统有不同的命令解释器)
    PATH=/sbin:/bin:/usr/sbin:/usr/bin  # crontab 脚本里的环境变量
    MAILTO=root                         #如果定时任务执行报错,会给root用户发邮件
    
    如 :You have new mail in /var/spool/mail/root 
    #2>a.txt 或者 &>/dev/null 可以避免这种烦人的输出
    
    
    # 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  #星期
    # |  |  |  |  |
    # *  *  *  *  *  user-name command to be executed
    
    # *  表示任意的(分、时、日、月、周)时间都执行
    # -  表示一个时间范围段, 如5-7点
    # ,  表示分隔时段, 如6,0,4表示周六、日、四
    # /1 表示每隔n单位时间, 如*/10 每10分钟
    
    [root@oldboy ~]# mail  查看有没有报错邮件
    No mail for root
    
    # 环境变量 命令行上面的PATH环境与crontab脚本里的PATH环境不一样,所以在写定时任务时最好使用命令的 绝对路径 去执行 ( 先which 一下,再crontab -e使用该命令 )
    
    crontab命令选项
    参数	含义
    -e	编辑定时任务 
    -l	查看定时任务 
    -r	删除所有当前用户的定时任务  # 或者 crontab -e ,再删除(删除一部分或所有)
    -u	   指定其他用户(root用户才能指定)
    root用户可以使用 crontab -r -u xx 删除指定用户的定时任务
    root用户可以使用 crontab -l -u xx 查看指定用户的定时任务
    root用户可以使用 crontab -e -u xx 编辑指定用户的定时任务
    
    root用户 可以检查 /var/spool/cron/ 下的定时任务,所以普通用户crontab -e的时候要注释( 执行目的 执行时间 姓名)
    [root@lb01 ~]# ll /var/spool/cron/  #每个普通用户如果设置定时任务,就会在词目录下生成一个以用户名命名的家目录
    

    定时任务潜规则:

    1. 可执行文件最好要使用(避免出错) #绝对路径
    2. 不能使用 复杂的命令行,不在当前环境变量里的命令(可以认为所有的基本命令都在PATH=/sbin:/bin:/usr/sbin:/usr/bin 里面)(复杂的命令写到脚本里,然后再在crontab -e 的时候执行就可以了)
    3. 所有输出放到 2>/tmp/a.txt &>/dev/null # 需要的留下来,不需要的丢到黑洞(crond -e 不认识变量,&不属于变量)
    4. 必须要有注释 # 方便root用户检查定时任务

    定时任务 编辑过程

    1.命令行,测试是否能执行成功
    2.加快定时的频率(实验每分钟的执行结果),测试定时任务是否能执行成成功
    3.修改成目标时间,定时任务设置完成

    [root@qls ~]# yum install -y ntpdate  
    [root@oldboy ~]# ntpdate         
    26 Apr 15:49:14 ntpdate[1536]: no servers can be used, exiting
    [root@oldboy ~]# ntpdate time1.aliyun.com
    26 Apr 15:51:19 ntpdate[1548]: step time server 203.107.6.88 offset 8.808498 sec
    
    # 每五分钟跟阿里云同步一次系统时间 日期:xxx 谁:xxx
    */5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null
    #*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com 2>>/tmp/a.txt &>/dev/null 
    
    # 追踪crontab日志,可以检测定时任务是否执行成功
    [root@oldboy ~]# tailf /var/log/cron   # crontab 的日志(每一次执行,时间 用户 命令),日志输出,在某个配置文件里指定了这个日志的位置
    

    定时任务的简单设置

    [root@oldboy ~]# crontab -e
    * * * * * /app/nginx/sbin/nginx -t 2>/tmp/nginx.txt
    
    [root@oldboy ~]# tailf /var/log/cron
    Apr 26 20:18:01 oldboy CROND[2655]: (root) CMD (/app/nginx/sbin/nginx -t 2>/tmp/nginx.txt)
    
    [root@oldboy ~]# cat /tmp/nginx.txt  
    # 总结:定时任务里面,要考虑命令行里面的环境变量 和脚本里的环境变量的差异,不是所有的命令都可以以 相对路径的方式在crontab脚本里执行,所以为了省时省力,在crontab脚本里 统一以绝对路径的方式表示命令
    nginx: the configuration file /app/nginx-1.16.1/conf/nginx.conf syntax is ok
    nginx: configuration file /app/nginx-1.16.1/conf/nginx.conf test is successful
    

    环境变量

    简单分类:
    1.命令行里面的环境变量
    2.shell脚本里面的环境变量
    3.系统自带命令环境变量
    4.自己添加的环境变量

    PATH=/sbin:/bin:/usr/sbin:/usr/bin  # crontab 脚本里的环境变量
    [root@oldboy ~]# echo $PATH  #命令行的变量环境
    /app/nginx-1.16.1/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    #让某个命令(或服务的启动程序)加入环境变量
    echo 'exrort PATH="/app/nginx/sbin:$PATH"'>>/etc/profile.d/nginx.sh   
    #注意PATH前后代表的变量 (source 之后才会生效)(注意"/app/nginx/sbin:$PATH" 不能用单引号, 记得source或者bash之后才会生效)
    

    自己尝试做一个命令

    a=1
    a=$a + 1
    
    [root@oldboy ~]# a=ls     
    [root@oldboy ~]# a
    bash: a: command not found
    
    #环境变量的作用:
    在 环境变量里面 的命令(二进制文件)(服务的启动程序)(普通的可执行文件)必须是 可执行文件,才有意义
    1.可以不用绝对路径的方式来表示
    2.可以在任何目录下TAB出来(补全)
    
    [root@oldboy ~]# vim syy
    ls
    [root@oldboy ~]# shmod u+x syy
    [root@lb01 ~]# /root/syy 
    2020-05-01-23:09_lb01.etc.t  a.sh	      ef     kk  syy
           
    [root@oldboy ~]# export PATH="/root/syy:$PATH"   
    [root@oldboy ~]# echo $PATH   # 增加,删除
    /root/syy:/app/nginx-1.16.1/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 
    [root@oldboy ~]# syy
    2020-05-01-23:09_lb01.etc.t  a.sh	      ef     kk  syy
    [root@lb01 /tmp]# syy
    a.log		  root
    

    crontab的时间编写规范

    时间参考网站

    分		时		日		月		周(# 特殊)
    *		 *		  *		   *		*                            ls
    0-59     0-23      1-31     1-12     1-7(周日 可以是0或者7)         命令
    
    #小心每分钟执行
    * * 1 * *               #每月一号的凌晨12点后每一分钟都会执行,执行一个月
    00 00 1 * *             #每月一号的凌晨12点执行
    * * * * *               #每分钟都会执行 
    */1 * */1 * * 		#每分钟都会执行
    * 2 * * *               #每天2点开始,每分钟执行一次,执行一个小时,执行了60次
    00 2 * * *              #每天两点执行一次
    
    #每两小时(N)和每隔一个小时(N-1) 一个意思
    */30 6 * * *            #6:00  6:30  执行2次
    30 6 * * *              #6:30  执行一次
    30 */6 * * *            # 每6个小时的30分执行一次脚本
    */30 */6 * * *          # 每6个小时 每30分钟执行一次脚本	
    
    #连续时间和不连续时间
    00 12 1,15 * *           # 每月1号和15号12点都执行 (,不连续)
    00 12 1-15 * *           # 每月1号到15号12点都执行  (- 连续)
    
    #日和周同时指定的时候
    00 02 14 * 7 ls         #每月14日并且是周日 凌晨2点都执行 (当 日 和 周 同时出现的时候,两个条件都要满足才会执行)  
    
    
    
    45 4 1,10,22 * * ls     #每月的1,10,22号的4:45执行
    45 4 1-10 * * ls        #每月的1到10号的4:45执行
    3,15 8-11 */2 * * ls    #每隔两天的上午8点到11点的第3和第15分钟执行
    0 23-7/1 * * * ls       #晚上23点到早上7点之间,每隔一个小时执行  23:00点会执行,8:00不会执行
    

    #!/bin/bsah
    
    echo "Hello World"
    
    #udp/123
    
    #安装软件
    
    yum install ntp -y &> /dev/null && echo "软件安装成功。"
    
    #同步时间
    
    ntpdate ntp1.aliyun.com &> /dev/null && echo "时间同步成功。"
    
    echo "ntpdate ntp1.aliyun.com" >> /etc/rc.local  && echo "时间同步写入开机自启。"
    
    chmod +x /etc/rc.d/rc.local
    
    cat <<EOF > /bin/ntpdate.sh && echo "时间同步脚本写入完成。"
    
    #!/bin/bash
    
    ntpdate ntp1.aliyun.com
    
    EOF
    
    chmod +x /bin/ntpdate.sh
    
    #echo "0 * * * * /bin/ntpdate.sh" > conf && crontab conf && echo "时间同步写入计划任务。"&& rm -f conf
    
    (crontab -l;echo "0 * * * * /bin/ntpdate.sh > /dev/null 2>&1 ") | crontab
    
    date && echo  "同步时间成功。"
    
  • 相关阅读:
    NoSQL数据库 Couchbase Server
    百度推广账户搭建思路
    禅道发邮件配置
    ASP 500错误解决方法
    MYSQL无法连接,提示10055错误尝试解决
    制作不随浏览器滚动的DIV-带关闭按钮
    [CSS3] :nth-child的用法
    [JS] 四角度旋转特效
    [JS] 瀑布流加载
    [CSS3] 二级下拉导航
  • 原文地址:https://www.cnblogs.com/syy1757528181/p/12814015.html
Copyright © 2011-2022 走看看