《前端运维》一、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 {} \;

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

 

posted @ 2022-03-23 09:47  Zaking  阅读(276)  评论(0编辑  收藏  举报