1、编写脚本实现登陆远程主机。(使用expect和shell脚本两种形式)。
shell:
[root@centos7 bash_repo]#cat remoteaccess.sh
#!/bin/bash
PASSWORD="sa123"
sshpass -p "$PASSWORD" ssh root@192.168.1.71
[root@centos7 bash_repo]#bash remoteaccess.sh
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Sun Nov 28 19:20:00 2021 from 192.168.1.68
[root@centos8sec ~]#
except
[root@centos8sec ~]#cat expectaccess.exp
#!/usr/bin/expect
spawn ssh 192.168.1.71
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "sa123\n" }
}
interact
[root@centos8sec ~]#expect expectaccess.exp
spawn ssh 192.168.1.71
root@192.168.1.71's password:
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Sun Nov 28 19:52:32 2021 from 192.168.1.71
[root@centos8sec ~]#
2、生成10个随机数保存于数组中,并找出其最大值和最小值
#!/bin/bash
declare -i min max
declare -a nums
for ((i=0;i<10;i++));do
nums[$i]=$RANDOM
[ $i -eq 0 ] && min=${nums[0]} && max=${nums[0]}&& continue
[ ${nums[$i]} -gt $max ] && max=${nums[$i]} && continue
[ ${nums[$i]} -lt $min ] && min=${nums[$i]}
done
echo "All numbers are ${nums[*]}"
echo Max is $max
echo Min is $min
3、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
[root@centos7 bash_repo]#cat bubblesort.sh
#!/bin/bash
arr=(6 5 3 1 8 7 2 4)
echo "Origigal order is "
echo ${arr[*]}
for ((i=0;i<8;i++))do
for((j=0;j<8-i-1;j++))do
if [ ${arr[j]} -gt ${arr[$((j+1))]} ]
then
#swap
temp=${arr[j]}
arr[$j]=${arr[$((j+1))]}
arr[$((j+1))]=$temp
fi
done
done
echo "Array sorted in acending order"
echo ${arr[*]}
[root@centos7 bash_repo]#sh bubblesort.sh
Origigal order is
6 5 3 1 8 7 2 4
Array sorted in acending order
1 2 3 4 5 6 7 8
[root@centos7 bash_repo]#
4、总结查看系统负载的几种命令,总结top命令的指标大概什么含义(不要求全部写出来)
系统负载:
free
[root@centos7 bash_repo]#free
total used free shared buff/cache available
Mem: 1863012 357568 504824 9896 1000620 1313300
Swap: 2097148 0 2097148
total 总物理内存大小
used 已使用
free 可用大小
shared 多个进程共享的内存总数
buffer 磁盘缓存大小
vmstat
[root@centos7 bash_repo]#vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 503816 2108 998532 0 0 2 5 69 60 0 0 99 0 0
Procs(进程):
r: 运行的和等待(CPU 时间片)运行的进程数,这个值也可以判断是否需要增加 CPU(长期大于 1)
b: 等待 IO 的进程数量,处于不可中断状态的进程数,常见的情况是由 IO 引起的
Memory(内存):
swpd: 使用虚拟内存大小,切换到交换内存上的内存(默认以 KB 为单位)
如果 swpd 的值不为 0,或者还比较大,比如超过 100M 了,但是 si, so 的值长期为 0,这种情况我
们可以不用担心,不会影响系统性能。
free: 空闲的物理内存
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小,文件系统的 cache,如果 cache 的值大的时候,说明 cache 住的文件数
多,如果频繁访问到的文件都能被 cache 住,那么磁盘的读 IO bi 会非常小
Swap:
si: 每秒从交换区写到内存的大小,交换内存使用,由磁盘调入内存
so: 每秒写入交换区的内存大小,交换内存使用,由内存调入磁盘
内存够用的时候,这 2 个值都是 0,如果这 2 个值长期大于 0 时,系统性能会受到影响。磁盘 IO 和
CPU 资源都会被消
常有人看到空闲内存(free)很少或接近于 0 时,就认为内存不够用了,实际上不能光看这一点的,还
要结合 si,so,如果 free 很少,但是 si,so 也很少(大多时候是 0),那么不用担心,系统性能这时不会受
到影响的。
IO:(现在的 Linux 版本块的大小为 1024bytes)
bi: 每秒读取的块数,从块设备读入的数据总量(读磁盘) (KB/s)
bo: 每秒写入的块数,写入到块设备的数据总理(写磁盘) (KB/s)
随机磁盘读写的时候,这 2 个 值越大(如超出 1M),能看到 CPU 在 IO 等待的值也会越大
system:
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
上面这 2 个值越大,会看到由内核消耗的 CPU 时间会越多
CPU(以百分比表示):
us: 用户进程消耗的 CPU 时间百分比,us 的值比较高时,说明用户进程消耗的 CPU 时间多,但是如
果长期超过 50% 的使用,那么我们就该考虑优化程序算法或者进行加速了
sy: 内核进程消耗的 CPU 时间百分比,sy 的值高时,说明系统内核消耗的 CPU 资源多,这并不是良
性的表现,我们应该检查原因。
id: CPU 处在空闲状态时间百分比(包括 IO 等待时间)
wa: IO 等待消耗的 CPU 时间百分比,wa 的值高时,说明 IO 等待比较严重,这可能是由于磁盘大量
作随机访问造成,也有可能是磁盘的带宽出现瓶颈(块操作)。
iostat
[root@centos7 bash_repo]#iostat -x
Linux 3.10.0-1127.el7.x86_64 (centos7) 2021年11月28日 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.45 0.00 0.25 0.01 0.00 99.30
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.02 0.05 0.11 2.06 5.21 91.78 0.00 3.52 5.77 2.48 1.26 0.02
scd0 0.00 0.00 0.00 0.00 0.01 0.00 114.22 0.00 13.33 13.33 0.00 11.61 0.00
dm-0 0.00 0.00 0.04 0.12 1.88 5.18 87.33 0.00 4.31 7.18 3.39 1.22 0.02
dm-1 0.00 0.00 0.00 0.00 0.01 0.00 50.09 0.00 0.18 0.18 0.00 0.11 0.00
dm-2 0.00 0.00 0.00 0.00 0.01 0.01 43.32 0.00 1.99 2.23 1.73 1.55 0.00
rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s
r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s
w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s
rsec/s: 每秒读扇区数。即 delta(rsect)/s
wsec/s: 每秒写扇区数。即 delta(wsect)/s
rkB/s: 每秒读 K 字节数。是 rsect/s 的一半,因为每扇区大小为 512 字节。
wkB/s: 每秒写 K 字节数。是 wsect/s 的一半。
avgrq-sz: 平均每次设备 I/O 操作的数据大小 (扇区)。即 delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均 I/O 队列长度。即 delta(aveq)/s/1000 (因为 aveq 的单位为毫秒)。
await: 平均每次设备 I/O 操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备 I/O 操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即
delta(use)/s/1000 (因为 use 的单位为毫秒)
如果 %util 接近 100%,说明产生的 I/O 请求太多,I/O 系统已经满负荷,该磁盘可能存在瓶颈。
比较重要的参数
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的
svctm: 平均每次设备 I/O 操作的服务时间
await: 平均每次设备 I/O 操作的等待时间
avgqu-sz: 平均 I/O 队列长度
如果%util 接近 100%,表明 i/o 请求太多,i/o 系统已经满负荷,磁盘可能存在瓶颈,一般%util 大于 70%,i/o 压
力就比较大,读取速度有较多的 wait.同时可以结合 vmstat 查看查看 b 参数(等待资源的进程数)和 wa 参数
(IO 等待所占用的 CPU 时间的百分比,高过 30%时 IO 压力高)。
uptime
[root@centos7 bash_repo]#uptime
23:24:33 up 2 days, 6:11, 4 users, load average: 0.05, 0.07, 0.06
23:24:33 //系统当前时间
up 2 days, //主机已运行时间,时间越大,说明你的机器越稳定
4 users, //用户连接数,是总连接数而不是用户数
load average: 0.05, 0.07, 0.06 // 系统平均负载,统计最近 1,5,15 分钟的系统平均负载
如果每个 CPU 内核的当前活动进程数不大于 3 的话,那么系统的性能是良好的。如果每个 CPU 内核的任
务数大于 5,那么这台机器的性能有严重问题。如果你的 linux 主机是 1 个双核 CPU 的话,当 Load Average
为 6 的时候说明机器已经被充分使用了。
uptime 命令用于查看服务器运行了多长时间以及有多少个用户登录,快速获知服务器的负荷情况。
uptime 的输出包含一项内容是 load average,显示了最近 1,5,15 分钟的负荷情况。它的值代表等待
CPU 处理的进程数,如果 CPU 没有时间处理这些进程,load average 值会升高;反之则会降低。load average
的最佳值是 1,说明每个进程都可以马上处理并且没有 CPU cycles 被丢失。对于单 CPU 的机器,1 或者
2 是可以接受的值;对于多路 CPU 的机器,load average 值可能在 8 到 10 之间。也可以使用 uptime 命
令来判断网络性能。例如,某个网络应用性能很低,通过运行 uptime 查看服务器的负荷是否很高,如
果不是,那么问题应该是网络方面造成的
w
[root@centos7 bash_repo]#w
23:27:55 up 2 days, 6:15, 4 users, load average: 0.00, 0.04, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 22:11 1:16m 0.04s 0.04s -bash
root pts/0 192.168.1.69 18:46 3.00s 0.19s 0.19s -bash
root pts/1 192.168.1.69 22:07 1:19m 0.01s 0.01s -bash
root pts/2 192.168.1.69 21:00 1:35m 0.04s 0.00s sshpass -p zzzzz ssh
第一列 user,代表登录的用户,第二列,tty 代表用户登录的终端号,因为在
linux 中并不是只有一个终端的,pts/2 代表是图形界面的第二个终端(这仅是个人意见,网上的对 pts
的看法可能有些争议)。第三列 FROM 代表登录的地方,如果是远程登录的,会显示 ip 地址,:0 表示的
是 display 0:0,意思就是主控制台的第一个虚拟终端。第四列 login@代表登录的时间,第五列的 IDLE
代表系统的闲置时间。最后一列 what 是代表正在运行的进程
TOP
top 命令用来显示系统当前的进程状况。
格式:top [选项]
主要选项如下。
d:指定更新的间隔,以秒计算。
q:没有任何延迟的更新。如果使用者有超级用户,则 top 命令将会以最高的优先序执行。
c:显示进程完整的路径与名称。
S:累积模式,会将已完成或消失的子进程的 CPU 时间累积起来。
s:安全模式。
i:不显示任何闲置(Idle)或无用(Zombie)的进程。
n:显示更新的次数,完成后将会退出 top
第一行表示的项目依次为当前时间、系统启动时间、当前系统登录用户数目、平均负载。
第二行显示的是 Tasks: 130total 进程总数、1 running 正在运行的进程数、129 sleeping 睡眠的进程数、
0 stopped 停止的进程数、0zombie 僵尸进程数
第三行显示的是目前 CPU 的使用情况,Cpu(s): 1% us 用户空间占用 CPU 百分比、0.7% sy 内核空间
占用 CPU 百分比、0.0% ni 用户进程空间内改变过优先级的进程占用 CPU 百分比、98.3% id 空
闲 CPU 百分比、0.0% wa 等待输入输出的 CPU 时间百分比、0.0% hi、0.0% si
第四行显示物理内存的使用情况,Mem: total 物理内存总量、used 使用的物理内存
总量、 free 空闲内存总量、 buffers 用作内核缓存的内存量
第五行显示交换分区使用情况,Swap total 交换区总量、0k used 使用的交换区总量、
free 空闲交换区总量、 cached 缓冲的交换区总量、内存中的内容被换出到交换区,
而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的
交换区的大小。相应的内存再次被换出时可不必再对交换区写入。
第六行显示的项目最多,下面列出了详细解释。
PID(Process ID):进程标志号,是非零正整数。USER:进程所有者的用户名。PR:进程的优先级别。
NI:进程的优先级别数值。VIRT:进程占用的虚拟内存值。RES:进程占用的物理内存值。SHR:进程
使用的共享内存值。STAT:进程的状态,其中 S 表示休眠,R 表示正在运行,Z 表示僵死状态,N 表
示该进程优先值是负数。%CPU:该进程占用的 CPU 使用率。%MEM:该进程占用的物理内存和总内
存的百分比。TIME:该进程启动后占用的总的 CPU 时间。COMMAND:进程启动的启动命令名称,如
果这一行显示不下,进程会有一个完整的命令行。
top 命令使用过程中,还可以使用一些交互的命令来完成其他参数的功能。这些命令是通过快捷键启
动的。
<空格>:立刻刷新。
A 分类显示系统不同资源的使用大户。有助于快速识别系统中资源消耗多的任务。
f 添加删除所要显示栏位.
o 调整所要显示栏位的顺序.
r 调整一个正在运行的进程 Nice 值.
k 结束一个正在运行的进程.
z 彩色/黑白显示开关
P:根据 CPU 使用大小进行排序。
T:根据时间、累计时间排序。
q:退出 top 命令。
m:切换显示内存信息。
t:切换显示进程和 CPU 状态信息。
c:切换显示命令名称和完整命令行。
M:根据使用内存大小进行排序。
W:将当前设置写入~/.toprc 文件中。这是写 top 配置文件的推荐方法。
可以看到,top 命令是一个功能十分强大的监控系统的工具,对于系统管理员而言尤其重要。但是,
它的缺点是会消耗很多系统资源
[root@centos7 bash_repo]#top
top - 23:30:21 up 2 days, 6:17, 4 users, load average: 0.34, 0.15, 0.09
Tasks: 130 total, 1 running, 129 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.0 us, 0.7 sy, 0.0 ni, 98.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1863012 total, 366768 free, 362248 used, 1133996 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1306652 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10045 root 20 0 889404 73156 18448 S 1.0 3.9 1:00.43 node
664 root 20 0 305500 6572 5164 S 0.3 0.4 1:57.61 vmtoolsd
1 root 20 0 125520 4036 2616 S 0.0 0.2 0:15.77 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
5 root 20 0 0 0 0 S 0.0 0.0 0:02.04 kworker/u256:0
6 root 20 0 0 0 0 S 0.0 0.0 0:02.90 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:17.86 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
5、编写脚本,使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输出"success!",若ping不通则输出"fail!"
for:
#!/bin/bash
NET=192.168.1
for ID in {1..254};do
{
ping -c1 -W1 $NET.$ID &> /dev/null && echo $NET.$ID success! || echo $NET.$ID fail!
}&
done
wait
while: 执行比for循环慢很多
#!/bin/bash
NET=192.168.1
i=0
while [ $i -le 255 ]
do
let i++
ping -c1 -W1 $NET.$i &> /dev/null && echo $NET.$i success! || echo $NET.$i fail!
done
6、每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间
[root@centos7 bash_repo]#crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@centos7 bash_repo]#crontab -l
30 1 * * 1-5 /root/bash_repo/backupetc.sh
[root@centos7 bash_repo]#cat /root/bash_repo/backupetc.sh
#!/bin/bash
YES_DAT=$(date --date='1 days ago' '+%Y%m%d%H')
cp /etc/yum.conf /backup/etcback-$YES_DAT.tar.xz