top命令

top命令用于实时显示进程状态

语法

top [option] 

选项

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

top的前五行表示当前系统统计信息

#第一行显示为当前时间、运行时间、登陆用户数、及系统负载(分别是一分钟、五分钟、十分钟)
top - 03:36:00 up  2:23,  3 users,  load average: 0.23, 0.07, 0.02
#第二行表示进程状态统计
Tasks: 158 total,   2 running, 156 sleeping,   0 stopped,   0 zombie
#第三行表示CPU使用情况
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st
#第四行物理内存使用情况及总量
MiB Mem :   1790.4 total,   1139.8 free,    255.6 used,    395.0 buff/cache
#第五行表示交换分区使用情况及总量
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   1367.9 avail Mem 

top列标题含义

PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)

top的内置命令

在top 命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了s 选项, 其中一些命令可能会被屏蔽。

h 显示帮助画面,给出一些简短的命令总结说明
k 终止一个进程。
i 忽略闲置和僵死进程。这是一个开关式命令。
q 退出程序
r 重新安排一个进程的优先级别
S 切换到累计模式
s 改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s
f或者F 从当前显示中添加或者删除项目
o或者O 改变显示项目的顺序
l 切换显示平均负载和启动时间信息
m 切换显示内存信息
t 切换显示进程和CPU状态信息
c 切换显示命令名称和完整命令行
M 根据驻留内存大小进行排序
P 根据CPU使用百分比大小进行排序
T 根据时间/累计时间进行排序

#对于多U多核的CPU来说在top界面中可以按数字1监控每个CPU的状况
#在top界面中可以按x打开或者关闭排序列的加亮效果(默认按照CPU使用情况排序)

屏幕截图 20211226 203746.png

iostat

iostat 可以提供IO性能状态数据 由sysstat软件包提供 选项

-c 只显示CPU行
-d 显示设备〈磁盘)使用状态
-k 以千字节为为单位显示输出
-t 在输出中包括时间戳
-x 在输出中包括扩展的磁盘指标

[root@localhost date]# iostat
Linux 4.18.0-305.3.1.el8.x86_64 (localhost.localdomain) 	12/26/2021 	_x86_64_	(2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.05    0.01    0.29    0.01    0.00   99.64

Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.82        14.70        11.61     342538     270506
scd0              0.00         0.04         0.00       1041          0

[root@localhost date]# 

练习

1、编写脚本实现登陆远程主机。(使用expect和shell脚本两种形式)。

#expect写法
[root@localhost date]# cat expect_ssh.sh 
#!/usr/bin/expect

spawn ssh  shi@192.168.1.46
expect {
	"yes/no" { send "yes\n";exp_continue}
	"password" { send "xxxxxx\n" }
 }
interact

[root@localhost date]# 
#shell写法
[root@localhost date]# cat shell_ssh.sh 
#!/bin/bash
ip=192.168.1.46
user=xxx
passwd=xxxxxx
expect << EOF
spawn ssh $user@$ip
expect {
	"yes/no" { send "yes\n";exp_continue }
	"password" { send "$passwd\n" }
}
expect eof
interact
EOF

2、生成10个随机数保存于数组中,并找出其最大值和最小值

[root@localhost date]# cat max.sh 
#!/bin/bash
declare -i min max
declare -a num
for ((i=0;i<10;i++));do
	num[$i]=$RANDOM
	[ $i -eq 0 ] && max=${num[$i]} && min=${num[$i]} && continue
	[ ${num[$i]} -gt $max ] && max=${num[$i]} && continue
	[ ${num[$i]} -lt $min ] && min=${num[$i]}
done
echo "all num are ${num[*]}"
echo max is $max
echo min is $min
[root@localhost date]# ./max.sh 
all num are 12966 19539 27815 19561 4770 87 24096 7691 5044 17118
max is 27815
min is 87

3、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序

[root@localhost date]# cat read.sh 
#!/bin/bash

echo "Please input a number list"
read -a nums
echo
echo "after sort is ${nums[*]}" 
len=${#nums[*]}
for((j=0;j<$len-1;j++));do 			   #外层循环提供找出数组中最大数的次数
	for((i=0;i<$len-1;i++));do         #内层循环找出数组中最大的数
		if [ ${nums[$i]} -gt ${nums[$i+1]} ];then
			tmp=${nums[$i]}
			nums[$i]=${nums[$i+1]}
			nums[$i+1]=$tmp
		fi
	done
done

echo "befor sort is ${nums[*]}"
[root@localhost date]# ./read.sh 
Please input a number list
10 25 12 78 9 6

after sort is 10 25 12 78 9 6
befor sort is 6 9 10 12 25 78

4、编写脚本,使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输出"success!",若ping不通则输出"fail!"

##for写法
[root@localhost date]# cat net_for.sh 
#!/bin/bash 
net=192.168.0
for((i=1;i<=254;i++));do
 {	
	if /bin/ping -c1 -W1 $net.$i &> /dev/null;then
			echo $net.$i success!
	else
		echo $net.$i fail!
	fi
}& #并行执行任务
done
wait #是每一个子进程都完成
##while写法
[root@localhost date]# cat net_while.sh 
#!/bin/bash 
net=192.168.0
i=1
while [ $i -lt 255  ];do
 {	
	if /bin/ping -c1 -W1 $net.$i &> /dev/null;then
		echo $net.$i success!
	else
		echo $net.$i fail!
	fi
}&
let i++
done
wait

5、每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间

[root@localhost date]# crontab -l
30 1 * * 1-5 [-d /backup ] || mkdir /backup ;/usr/bin/tar zcf etcbak-`date -d "-1 day" +%F-%H`.tar.xz /etc
[root@localhost date]#