• 《前端运维》一、Linux基础10定时任务


    一、进程管理

    进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。以上这段话来自百度百科

    简单来说哈,进程就是运行一段代码的实体。在linux中,我们可以通过命令来查看系统中所有的进程、判断服务器的状态、杀死进程等等。下面我们来看一下相关的命令都有哪些。

    1、ps

    该命令用来显示当前进程的状态,类似于Windows的任务管理器。它的选项非常多,这里仅简单说下常用的选项:

    • -A,显示所有进程
    • -w,显示加宽,可以显示更多的资讯
    • -au,显示较详细的资讯
    • -aux,显示所有包含其他使用者的行程

    然后呢,我们来看下-au(x)命令下显示信息字段的含义:

    数据含义
    USER 该进程是由哪个用户创建的
    PID 进程的ID号
    %CPU 该进程占用CPU资源的百分比,占用越高说明越消耗系统资源
    %MEM 该进程占用物理内存的百分比,占用越高说明越消耗系统资源
    VSZ 该进程占用虚拟内存的百分比,单位是KB
    RSS 该进程占用实际物理内存大小,单位是KB
    TTY 该进程在哪个终端中运行。tty1~tty7表示本地控制终端,tty1~tty6是字符终端,tty7是图形终端。pts/0~255代表虚拟终端,?表示此终端是系统启动的
    STAT 进程状态
    START 该进程的启动时间
    TIME 该进程占用CPU的运算时间,数值越高说明越消耗系统资源
    COMMAND 产生此进程的命令名

    其中STAT进程状态对应的字段含义是:

    • D: 无法中断的休眠状态 (通常 IO 的进程)
    • R: 正在执行中
    • S: 静止状态
    • T: 暂停执行
    • Z: 不存在但暂时无法消除
    • W: 没有足够的记忆体分页可分配
    • <: 高优先序的行程
    • N: 低优先序的行程
    • L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)

    2、pstree

     将所有行程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 这个基本行程为根 (root),如果有指定使用者 id,则树状图会只显示该使用者所拥有的行程,常用选项如下:

    1. -u,显示用户名称
    2. -p,显示进程pid

    3、top

    该命令用于实时显示process的动态。常用选项如下:

    • -d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
    • -q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
    • -c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称
    • -S : 累积模式,会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来
    • -s : 安全模式,将交谈式指令取消, 避免潜在的危机
    • -i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程
    • -n : 更新的次数,完成后将会退出 top
    • -b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内

    直接执行top命令显示如下信息:

     解释下信息的内容:

    第一行是任务队列信息。

    内容说明
    12:12:12 系统的当前时间
    up 1 day 5:33 系统的运行时间,本机已经运行了1天5小时33分
    2 users 当前登录了二个客户端
    load average 0 0 0 系统在之前1分钟、5分钟、15分钟的平均负载。一般认为小于1小时负载较小,大于1超过负载

    第二行是行为进程信息。

    内容说明
    Tasks: 100 total 系统中的进程总数
    1 running 正在运行的进程数
    94 sleeping 睡眠的进程
    0 stopped 正在停止的进程
    0 zombie 僵尸进程。如果不是0的话要进行检查

    第三行是行为CPU信息。

    %Cpu(s): 0.1us 用户模式占用的CPU百分比
    0.1sy 系统模式占用的CPU百分比
    0.0ni 改变过优先级的用户进程 占用的CPU百分比
    99.7id 空闲CPU的CPU百分比
    0.1wa 等待输入/输出的进程的占用CPU百分比
    0.1hi 硬中断请求服务占用的CPU百分比
    0.1si 软中断请求服务占用的CPU百分比
    0.0st st(Steal time)虚拟时间百分比,就是当有

    第四行是行为物理内存信息。

    内容说明
    Mem: 1030720k total 物理内存的问题,单位是KB
    551860k used 已经使用的物理内存数量
    478860k free 空闲的物理内存数量,虚拟机分配了1024M内存,使用了538M,空闲467M
    43180k buffers 作为缓冲的内存数量,可以存放需要写入硬盘的数据,用来加速数据的写入

    第五行为交换分区信息。

    内容说明
    Swap: 2047992k total 总计的交换分区(虚拟内存)大小
    536k used 已经使用的交换分区大小
    2047456k free 空闲的交换分区大小
    368164k cached 把需要经常读取的数据从硬盘读到内存中,加速了数据的读取

    另外我们需要学习的就是一些交互式命令:

    选项含义
    ?或h 显示交互模式的帮助
    P 按CPU使用率排序,默认就是此选项
    M 以内存的使用率排序
    N 以PID排序
    q 退出top

    4、kill

    该命令用于删除执行中的程序或工作。kill 可将指定的信息送至程序。预设的信息为 SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序。程序或工作的编号可利用 ps 指令或 jobs 指令查看。常用选项如下:

    • -l <信息编号>  若不加<信息编号>选项,则 -l 参数会列出全部的信息名称。
    • -s <信息名称或编号>  指定要送出的信息。
    • [程序]  [程序]可以是程序的PID或是PGID,也可以是工作编号。

    常用的信息编号如下:

    • 1 (HUP):重新加载进程。
    • 9 (KILL):杀死一个进程。
    • 15 (TERM):正常停止一个进程。

    下面我们来看一个小栗子:

    我们创建一个sh文件,并将它存储在/demo下,文件的内容如下:

    #!/bin/bash
    
    i=0
    while [ $i -le 1000 ]
     do
       echo $(date)
       sleep 1s
     done

    很简单,就是循环执行1000次,打印当前日期。然后我们重新开个窗口来执行这段脚本。然后他就一直打印了:

     我们来杀死他,杀死他之前需要知道他的信息编号,我们来看下:

    第一种方法是这样执行脚本:

     它会打印信息编号后再执行。于是我们就可以:

     然后,另一个窗口运行的代码就停止了。

    另一种查询的方法是这样的:

     也可以查到信息编号。好了,小栗子就到这里,我们继续往下学习。

    二、系统资源查看

    1、vmstat

    监控系统资源使用状态,vmstat [刷新延时] [刷新次数]。比如vmstat 1 3。就是每秒刷新一次,刷新三次后停止。

     其中字段的含义如下:

    1)procs:进程信息字段

    分类参数含义
    procs r 等待运行的进程数,数量越大,系统就越繁忙
    procs b 不可被唤醒的进程数量,数量越大,系统越繁忙

    2)memory:内存信息字段

    分类参数含义
    memory swpd 使用的Swap空间的大小,单位KB
    memory free 空闲的内存容量,单位KB
    memory buff 缓冲的内存容量,单位KB
    memory cache 缓存的内存容量,单位KB

    3)swap:交换分区字段,如果说si和so数越大说明数据经常要在磁盘和内存之间数据交换,系统性能就会越差

    分类参数含义
    swap si(in) 从磁盘中交换到内存中的数据的数量,单位KB
    swap so(out) 从内存中交换到硬盘中的数据的数量,单位KB

    4)io:磁盘读写,bi和bo数越大,说明磁盘的I/O越繁忙。

    分类参数含义
    io bi(in) 从块设备读入数据的问题,单位是块
    io bo(out) 写到块设备的数据的总量,单位是块

    5)system:系统信息字段,in和cs数越大说明系统与接口设备的通信越频繁。

    分类参数含义
    system in(interrupt) 每秒被中断的进程次数
    system cs(switch) 每秒钟进行的事件切换次数

    6)CPU:CPU信息字段

    分类参数含义
    CPU us(user) 非内核进程消耗CPU运算时间的百分比
    CPU sy(system) 内核进程消耗CPU运算时间的百分比
    CPU id(idea) 空闲CPU的百分比
    CPU wa(wait) 等待I/O所消耗的CPU百分比
    CPU st(steal) 被虚拟机偷走的CPU百分比

    2、free

    该命令用于显示内存状态。free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。常用选项如下:

    • -b, 以字节为单位
    • -k ,以KB字节为单位
    • -m ,以MB字节为单位
    • -g ,以GB字节为单位
    • -h ,以合适的单位显示内存使用情况,最大为三位数,自动计算对应的单位值。单位有:B = bytes,K = kilos,M = megas,G = gigas,T = teras
    • -o ,不显示缓冲区调节列。
    • -s <间隔秒数> ,持续观察内存使用状况。
    • -t ,内存总和列。
    • -V ,显示版本信息。

    比如我们试一下free -m命令,显示如下:

     3、uname

    用来查看内核相关信息,常用选项如下:

    • -a或--all  显示全部的信息。
    • -m或--machine  显示电脑类型。
    • -n或--nodename  显示在网络上的主机名称。
    • -r或--release  显示操作系统的发行编号。
    • -s或--sysname  显示操作系统名称。
    • -v  显示操作系统的版本。
    • --help  显示帮助。
    • --version  显示版本信息。

    4、file 

    该指令用于辨识文件类型。常用选项如下:

    • -b  列出辨识结果时,不显示文件名称。
    • -c  详细显示指令执行过程,便于排错或分析程序执行的情形。
    • -f<名称文件>  指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称。
    • -L  直接显示符号连接所指向的文件的类别。
    • -m<魔法数字文件>  指定魔法数字文件。
    • -v  显示版本信息。
    • -z  尝试去解读压缩文件的内容。
    • [文件或目录...] 要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。

    通过file命令,可以查看/bin/ls来查看操作系统位数。

    5、其他

    可以通过lsb_release -a命令查看发行版本。可以通过lsb_release -v命令查看发行版本。

    三、定时任务

    1、crontab

    该命令可以用来定期执行程序。当安装完成操作系统之后,默认便会启动此任务调度命令。crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

    注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。而 linux 任务调度的工作主要分为以下两类:

    • 1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
    • 2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置

    可以通过下面的命令重启cron:

    systemctl restart crond.service

    然后可以通过ps -ef | grep crond来查看是否启动了crond:

    crontab命令常用的选项如下:

    • -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
    • -r : 删除目前的时程表
    • -l : 列出目前的时程表

    说明:

    crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。

    -u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

    crontab的语法如下:

    crontab [ -u user ] file
    # 或者
    crontab [ -u user ] { -l | -r | -e }

     循环任务还有时间格式,如下:

    f1 f2 f3 f4 f5 program
    • 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
    • 当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
    • 当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
    • 当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
    • 当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推
    *    *    *    *    *
    -    -    -    -    -
    |    |    |    |    |
    |    |    |    |    +----- 星期中星期几 (0 - 6) (星期天 为0)
    |    |    |    +---------- 月份 (1 - 12) 
    |    |    +--------------- 一个月中的第几天 (1 - 31)
    |    +-------------------- 小时 (0 - 23)
    +------------------------- 分钟 (0 - 59)

    额外的,表示时间还有些特殊符号,我们要注意一下:

    符号含义例子
    * 代表任意时间 比如第一个星就代表一个小时中每分钟都执行一次
    , 代表不连续的时间 比如"1,2,3 ",就代表每小时的1分、2分、3分执行命令
    - 代表连续的时间范围 比如 " 1-5 * ** ",代表每小时的第1分到第5分执行命令
    */n 代表每隔多久执行一次 比如 "/10 " 就代表每隔10分钟就执行一次命令
    0 0 1,10 * 1 每月1号和10号,每周1的0点0分都会执行

    仅仅罗列语法有点模糊,我们来看个例子吧:

    首先,我们通过定时任务的编辑模式命令,编辑一个定时任务:

    crontab -e

    然后再vi的指令模式下点击键盘的i,这个就不多说了,在vi的那一章有详细的讲,然后我们编辑一个定时任务:

    * * * * * echo `date` >> /root/date.log

    什么意思呢,就是每分钟打印日期并输入到date.log文件中。要注意,定时任务中的时间最小单位是分钟,最大单位是天,另外,无论是写命令还是脚本都需要使用绝对路径。额外要说明的是:

    • crontab -e是用户执行的命令,不同的用户身份可以执行自己的定时任务
    • 如果需要系统执行定时任务,可以编辑/etc/crontab文件
    • /etc/crontab可以指定shell、路径、邮件发送和家目录

    我们继续上面的例子:

    写完定时任务后,我们保存并推出退出。然后就会出现如下的提示:

     即,安装了新的定时任务。另外,我们也可以通过crontab -l命令查看当前的定时任务:

     然后呢,我们看看date.log文件:

     发现任务确实是在跑的。就让它先跑着吧...。

    四、定时任务实战

    还记得之前我们安装了nginx、mysql等工具,下面我们通过这章的学习内容,来监控下各工具的运行状态。

    1、监控nginx状态

    监控的代码如下:

    #!/bin/bash
    #设置本地变量
    #变量nginx的结果是查询nginx的进程,不包含grep自身
    nginx=`ps -ef |grep /user/sbin/nginx|grep -v grep|wc -l`
    # 然后下面的意思大家都懂了吧,不懂就回头复习一遍
     if [ $nginx -gt 2 ];then
        echo "your nginx is running"
        exit 0
     else
        echo "your nginx is ready to  rerunning"
        /bin/systemctl start nginx.service
        exit 1
    fi

    然后我们跑一下这个命令试一下,还是之前demo的位置,这个位置其实无所谓,就是你放置脚本的位置就对了:

     然后,我们可以:

    curl http://localhost

    就可以看到了结果了。欸?你这是手动的啊,也没定时啊。没错。但是,我们可以把命令按照前面的例子加进去就可以了,这里不再演示,大家要自己动手了哦。

    2、监控mysql状态

    这回大家都知道怎么用了吧,这回仅展示下定时任务的脚本,别的就不说啦:

    #!/bin/bash
    PortNum=`netstat -lnt|grep 3306|wc -l`
    if [ $PortNum -gt 0 ]
    then
     echo "mysqld is running."
    else
     echo "mysqld is stoped."
    fi

    3、mysql备份

    #!/bin/bash
    DATE=$(date +%F_%H-%M-%S)
    HOST=127.0.0.1
    DB=test
    USER=root
    PASS=abcd1#EFG
    MAIL="83687401@qq.com"
    BACKUP_DIR=/data/db_backup
    if [ ! -d "$BACKUP_DIR" ];then
     mkdir -p $BACKUP_DIR
    fi
    SQL_FILE=${DB}_FULL_$DATE.sql
    BAK_FILE=${DB}_FULL_$DATE.zip
    cd $BACKUP_DIR
    if mysqldump -h$HOST -u$USER -p$PASS -B $DB > $SQL_FILE; then
      zip $BAK_FILE $SQL_FILE && rm -rf $SQL_FILE
      if [ ! -s $BAK_FILE ]; then
        echo "$DATE 备份失败" | mail -s "备份失败" $MAIL
      fi
    else
      echo "$DATE 备份失败" | mail -s "备份失败" $MAIL
    fi
    find $BACKUP_DIR -name '*.zip' -ctime +14 -exec rm {} \;

    到此这篇文章就结束了哦。

  • 相关阅读:
    字符串比较,栈溢出引起的程序bug
    C语言实现的矩阵乘法运算器
    n阶魔方阵(奇数阵)的输出
    文件的上传和下载---以图片为例
    数据列表的分页显示---前端及后台
    表单重复提交的解决方法
    JAVA基础----持续更新
    Servlet---基础、转发重定向、编码问题解析
    JDBC的链接及封装
    com.mysql.jdbc.connection和java.sql.connection的区别
  • 原文地址:https://www.cnblogs.com/zaking/p/14843112.html
Copyright © 2020-2023  润新知