一、进程管理
进程(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,则树状图会只显示该使用者所拥有的行程,常用选项如下:
- -u,显示用户名称
- -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="[email protected]" 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 {} \;
到此这篇文章就结束了哦。