Linux脚本练习
编写脚本实现登陆远程主机(使用expect和shell脚本两种形式)
[root@aiden ~]
set ip 192.168.1.192
set user root
set password 520123
set timeout 10
spawn ssh -o StrictHostKeyChecking=no $user@$ip
expect {
"password" { send "$password\n" }
}
interact
[root@aiden ~]
spawn ssh -o StrictHostKeyChecking=no root@192.168.1.192
root@192.168.1.192's password:
Last login: Sun Aug 15 09:43:29 2021 from 192.168.1.1
[root@localhost ~]#
# shell脚本形式
[root@aiden ~]# vim login_shell.sh
#!/bin/bash
ip=192.168.1.192
user=root
password=520123
expect <<EOF
set timeout 20
spawn ssh -o StrictHostKeyChecking=no $user@$ip
expect {
"password" { send "$password\n" }
}
expect eof
EOF
# 运行测试
[root@aiden ~]# ./login_shell.sh
spawn ssh -o StrictHostKeyChecking=no root@192.168.1.192
root@192.168.1.192's password:
Last login: Sun Aug 15 10:49:16 2021 from 192.168.1.191
[root@localhost ~]
生成10个随机数保存于数组中,并找出其最大值和最小值
[root@aiden ~]
declare -a num_list
declare -a min_num
declare -a max_num
for i in {0..9};do
num_list[$i]=$RANDOM
[ $i -eq 0 ] && min_num=${num_list[$i]} && max_num=${num_list[$i]} && continue
if [ ${num_list[$i]} -lt $min_num ];then
min_num=${num_list[$i]}
elif [ ${num_list[$i]} -gt $max_num ];then
max_num=${num_list[$i]}
fi
done
echo "num array : ${num_list[@]}"
echo "minimal num : $min_num"
echo "maximal num : $max_num"
[root@aiden ~]
num array : 14806 9017 11187 13515 385 19961 19876 20713 29352 31393
minimal num : 385
maximal num : 31393
输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
[root@aiden ~]
declare -i size=$#
declare -a num_list
[ $size -le 1 ] && echo "number size is $size , please input more number !" && exit 10
until [ $# -eq 0 ];do
if [[ ! $1 =~ ^[-]?[1-9][0-9]*$ ]]; then
echo " $1 is not number; please input number !"
exit 10
fi
num_list[size - $#]=$1
shift
done
for (( i = 0; i < size-1; i++ )); do
trans_time=0
for (( j = 0; j < size - i -1; j++ )); do
if [ ${num_list[$j]} -gt ${num_list[$j+1]} ]; then
tmp=${num_list[$j]}
num_list[j]=${num_list[$j+1]}
num_list[j+1]=$tmp
(( trans_time++ ))
fi
done
if [ $trans_time -eq 0 ]; then
break;
fi
done
echo "num_list : ${num_list[@]}"
[root@aiden ~]
num_list : -10 -1 10 20 101
使用for和while分别实现192.168.1.0/24网段内,地址是否能够ping通,若ping通则输出"success!",若ping不通则输出"fail!"
[root@aiden ~]
prefix="192.168.1"
for i in `seq 1 254`; do
if ping -c 1 -W 1 -q ${prefix}.$i &> /dev/null ;then
echo "ping ${prefix}.$i success!"
else
echo "ping ${prefix}.$i fail!"
fi
done
[root@aiden ~]
prefix="192.168.1"
i=1
while (( i <= 254 ));do
if ping -c 1 -W 1 -q ${prefix}.$i &> /dev/null ; then
echo "ping ${prefix}.$i success!"
else
echo "ping ${prefix}.$i fail!"
fi
let i++
done
每周的工作日1:30,将/etc备份至/backup目录中,保存的文件名称格式 为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间
DAY=$(date +"%F-%H" -d "-1 days" )
if [ ! -d /backup ]; then
rm -rf /backup
mkdir -p /backup
fi
tar -JcPf /backup/etcbak-`date +"%F-%H" -d "-1 days"`.tar.xz /etc
[root@aiden ~]
30 1 * * 1-5 /root/backup_etc.sh > /dev/null
总结系统负载的命令,总结top命令的指标
top
top监控页面
top - 01:53:40 up 11:29, 5 users, load average: 0.00, 0.03, 0.05
Tasks: 117 total, 1 running, 116 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995676 total, 215232 free, 197372 used, 583072 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 631120 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
94177 root 20 0 162080 2200 1540 R 0.7 0.2 0:00.05 top
404 root 20 0 0 0 0 S 0.3 0.0 0:29.54 xfsaild/dm-0
1 root 20 0 128184 6840 4184 S 0.0 0.7 0:02.58 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:03.03 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
....
top系统整体的统计信息
第一行是任务队列信息,同 uptime 命令的执行结果
属性 | 表示信息 |
---|
01:53:40 | 当前时间 | up 11:29 | 系统运行时间,格式为时:分 | 5 user | 当前登录用户数 | load average: 0.00, 0.03, 0.05 | 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值 |
第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行
属性 | 表示信息 |
---|
117 total | 进程总数 | 1 running | 正在运行的进程数 | 116 sleeping | 睡眠的进程数 | 0 stopped | 停止的进程数 | 0 zombie | 僵尸进程数 |
属性 | 表示信息 |
---|
0.0 us | 用户空间占用CPU百分比 | 0.0 sy | 内核空间占用CPU百分比 | 0.0 ni | 用户进程空间内改变过优先级的进程占用CPU百分比 | 100.0 id | 空闲CPU百分比 | 0.0 wa | 等待I/O的CPU时间百分比 | 0.0 hi | CPU硬中断时间百分比 | 0.0 si | CPU软中断时间百分比 | 0.0 st | 虚拟机时间百分比 |
最后两行为内存和swap信息
Mem属性 | 表示信息 |
---|
995676 total | 物理内存总量 | 215232 free | 空闲内存总量 | 197372 used | 使用中的物理内存总量 | 583072 buff/cache | 用作缓存的内存总量 |
Swap属性 | 表示信息 |
---|
192772k total | 交换区总量 | 0k used | 使用的交换区总量 | 192772k free | 空闲交换区总量 | 123988k cached | 缓冲的交换区总量 |
top进程统计信息
序号 | 列名 | 含义 |
---|
a | PID | 进程id | b | PPID | 父进程id | c | RUSER | Real user name | d | UID | 进程所有者的用户id | e | USER | 进程所有者的用户名 | f | GROUP | 进程所有者的组名 | g | TTY | 启动进程的终端名。不是从终端启动的进程则显示为 ? | h | PR | 优先级 | i | NI | nice值。负值表示高优先级,正值表示低优先级 | j | P | 最后使用的CPU,仅在多CPU环境下有意义 | k | %CPU | 上次更新到现在的CPU时间占用百分比 | l | TIME | 进程使用的CPU时间总计,单位秒 | m | TIME+ | 进程使用的CPU时间总计,单位1/100秒 | n | %MEM | 进程使用的物理内存百分比 | o | VIRT | 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES | p | SWAP | 进程使用的虚拟内存中,被换出的大小,单位kb。 | q | RES | 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA | r | CODE | 可执行代码占用的物理内存大小,单位kb | s | DATA | 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb | t | SHR | 共享内存大小,单位kb | u | nFLT | 页面错误次数 | v | nDRT | 最后一次写入到现在,被修改过的页面数。 | w | S | 进程状态 D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程 | x | COMMAND | 命令名/命令行 | y | WCHAN | 若该进程在睡眠,则显示睡眠中的系统函数名 | z | Flags | 任务标志,参考 sched.h |
uptime
[root@aiden ~]# uptime
02:27:24 up 12:03, 5 users, load average: 0.00, 0.01, 0.05
参考top命令的第一行解释
w
[root@aiden ~]
02:30:17 up 12:06, 5 users, load average: 0.05, 0.04, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 10Jul21 22days 0.47s 0.47s -bash
root pts/0 192.168.1.1 25Jul21 22days 0.00s 0.00s -bash
root pts/1 192.168.1.53 10Jul21 36days 0.12s 0.12s -bash
root pts/2 192.168.1.1 22:15 1.00s 0.25s 0.00s w
root pts/3 192.168.1.1 22:10 4:04m 0.04s 0.04s -bash
第一行参考top第一行解释
属性 | 表示信息 |
---|
USER | 登录的用户 | TTY | 登录分配的终端号 | FROM | 远程主机名,从哪里登录 | LOGIN@ | 何时登录 | IDLE | 用户闲置时间 | JCPU | 该终端(tty)连接的所有进程占用的时间 | PCPU | 指当前进程(即在WHAT项中显示的进程)所占用的时间 | WHAT | 当前正在运行进程的命令 |
|