脚本19练
文章目录
- 1、监控系统中的cpu、内存、硬盘、、使用率超过80%进行邮件告警(可使用邮箱163、QQ、139等
- 2、监控系统中的IO wait大于50进行邮件告警(可使用邮箱163、QQ、139等)
- 3、监控系统中的网络流量下载上传超过10M(可变)进行邮件告警(可使用邮箱163、QQ、139等)
- 4、使用脚本自动创建逻辑卷
- 5、检查特定的软件包是否已经安装
- 6、自动优化 Linux 内核参数
- 7、自动对磁盘分区、格式化、挂载
- 8、统计/var/log 有多少个文件,并显示这些文件名
- 9、编写一个点名器脚本
- 10、使用死循环实时显示 eth0 网卡发送的数据包流量
- 11、编写脚本,实现人机<石头,剪刀,布>游戏
- 12、依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字
- 13、根据计算机当前时间,返回问候语,可以将该脚本设置为开机启动
- 14、从键盘读取一个论坛积分,判断论坛用户等级
- 15、统计 Linux 进程相关数量信息
- 16、批量下载有序文件(pdf、图片、视频等等)
- 17、生成随机密码(字串截取版本)
- 18、监控 HTTP 服务器的状态(测试返回码
- 19、每天定时备份A文件(可以任意)到目标backup文件中,备份时间是为凌晨3点并且删除改文件夹下超过30天的文件。
- 19、每天定时备份A文件(可以任意)到目标backup文件中,备份时间是为凌晨3点并且删除改文件夹下超过30天的文件。
1、监控系统中的cpu、内存、硬盘、、使用率超过80%进行邮件告警(可使用邮箱163、QQ、139等
#!/bin/bash
#set -x
#top -n 1 运行一次
#awk -F 取列,[ %]+:以%,空格为分隔,NR==3为判定条件(取第三行),{print $3}:第三列
cpu=top -n 1 | awk -F '[ %]+' 'NR==3 {print $3}'
data_name="/dev/sdb1"
disk=df -h | grep $data_name | awk -F '[ %]+' '{print $5}'
logfile=/tmp/jiankong.log
mem_total=free -m | awk -F '[ :]+' 'NR==2{print $2}'
mem_used=free -m | awk -F '[ :]+' 'NR==2{print $3}'
#BEFIN{printf “%.0f\n”}在awk中首先运行的,以保留一位小数形式输出
mem_used_present=awk 'BEGIN{printf "%.0f\n",('$mem_used'/'$mem_total')*100}'
now_time=date '+%F %T' #显示当前时间
send_mail(){
mail -s “监控报警” 1724956149@qq.com < /tmp/jiankong.log
}
check(){
if [ echo "$cpu" |bc -gt 80 -o “
d
i
s
k
"
−
g
t
40
−
o
"
disk" -gt 40 -o "
disk"−gt40−o"mem_used_present” -gt 80 ]
then
echo “报警时间:${now_time}” >
l
o
g
f
i
l
e
e
c
h
o
"
C
P
U
使
用
率
:
logfile echo "CPU使用率:
logfileecho"CPU使用率:{cpu}% --> 磁盘使用率:
d
i
s
k
{disk}% --> 内存使用率:
disk{mem_used_present}" >> $logfile
send_mail
fi
}
check
2、监控系统中的IO wait大于50进行邮件告警(可使用邮箱163、QQ、139等)
#!/bin/bash
#set -x
#iostat查看iowait的命令,是个优化命令
iowait=iostat | awk 'NR==4{print $5}'
now_time=date '+%F %T' #显示当前时间
logfile=/home/jiankong2.log
send_mail(){
mail -s “监控报警” 1724956149@qq.com < /home/jiankong2.log
}
check(){
if [ echo "$iowait"|bc -gt 50 ]
then
echo “报警时间:${now_time}” >
l
o
g
f
i
l
e
e
c
h
o
"
i
o
w
a
i
t
:
logfile echo "iowait:
logfileecho"iowait:{iowait}%" >> $logfile
send_mail
fi
}
check
3、监控系统中的网络流量下载上传超过10M(可变)进行邮件告警(可使用邮箱163、QQ、139等)
#!/bin/bash
set -x
xiazai=ifconfig ens33 |awk 'NR==5{print $5}'
shanchaung=ifconfig ens33 | awk 'NR==7{print $5}'
now_time=date '+%F %T' #显示当前时间
logfile=/home/jiankong3.log
send_mail(){
mail -s “监控报警” 1724956149@qq.com < /home/jiankong3.log
}
check(){
if [ $xiazai -gt 10000 -o
s
h
a
n
c
h
a
u
n
g
−
g
t
10000
]
t
h
e
n
e
c
h
o
"
报
警
时
间
:
shanchaung -gt 10000 ] then echo "报警时间:
shanchaung−gt10000]thenecho"报警时间:{now_time}" >
l
o
g
f
i
l
e
e
c
h
o
"
x
i
a
z
a
i
:
logfile echo "xiazai:
logfileecho"xiazai:{xiazai} --> shanchaung:${shanchaung}" >> $logfile
send_mail
fi
}
check
4、使用脚本自动创建逻辑卷
#!/bin/bash
#扫描磁盘
for i in /sys/class/scsi_host/host*/scan
do
echo “- - -” > $i
done
fdisk -l #查看磁盘信息
echo "n
p
t
8e
w" | fdisk /dev/sdb
echo "n
p
t
8e
w" | fdisk /dev/sdc
pvcreate /dev/sdb1 /dev/sdc1
vgcreate luo /dev/sdb1 /dev/sdc1
lvcreate -L 30G -n nj luo
mkfs -t xfs /dev/luo/nj
mkdir /home/lvm
mount /dev/luo/nj /home/lvm
df -Th
5、检查特定的软件包是否已经安装
#!/bin/bash
if [ “$(rpm -q httpd)”=“未安装软件包 httpd” ] #注意这里的等号两边绝对不能加空格
then
echo “软件未安装,正在帮您安装请稍等…”
yum install httpd -y &> /dev/null
echo “安装完成”
else
echo “软件包已安装”
fi
6、自动优化 Linux 内核参数
#!/bin/bash
#这个参数表示进程可以同时打开的最大数,这个参数直接限制最大的并发连接数,根据实际情况配置
echo “fs.file-max = 999999” >> /etc/sysctl.conf
echo “net.ipv4.ip_forward = 0” >> /etc/sysctl.conf
echo “net.ipv4.conf.default.rp_filter = 1” >> /etc/sysctl.conf
echo “net.ipv4.conf.default.accept_source_route = 0” >> /etc/sysctl.conf
echo “kernel.sysrq = 0” >> /etc/sysctl.conf
echo “kernel.core_uses_pid = 1” >> /etc/sysctl.conf
##开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。
echo “net.ipv4.tcp_syncookies = 1” >> /etc/sysctl.conf
echo “kernel.msgmnb = 65536” >> /etc/sysctl.conf
echo “kernel.msgmax = 65536” >> /etc/sysctl.conf
echo “kernel.shmmax = 68719476736” >> /etc/sysctl.conf
echo “kernel.shmall = 4294967296” >> /etc/sysctl.conf
#这个参数表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。
echo "net.ipv4.tcp_max_tw_buckets = 6000 " >> /etc/sysctl.conf
echo “net.ipv4.tcp_sack = 1” >> /etc/sysctl.conf
echo “net.ipv4.tcp_window_scaling = 1” >> /etc/sysctl.conf
#这个参数定义了TCP接受缓存(用于TCP接受滑动窗口)的最小值、默认值、最大值。
echo “net.ipv4.tcp_rmem = 10240 87380 12582912” >> /etc/sysctl.conf
#这个参数定义了TCP发送缓存(用于TCP发送滑动窗口)的最小值、默认值、最大值。
echo “net.ipv4.tcp_wmem = 10240 87380 12582912” >> /etc/sysctl.conf
#这个参数表示内核套接字发送缓存区默认的大小。
echo “net.core.wmem_default = 8388608” >> /etc/sysctl.conf
#这个参数表示内核套接字接受缓存区默认的大小。
echo “net.core.rmem_default = 8388608” >> /etc/sysctl.conf
#这个参数表示内核套接字接受缓存区的最大大小。
echo “net.core.rmem_max = 16777216” >> /etc/sysctl.conf
#这个参数表示内核套接字发送缓存区的最大大小。
echo “net.core.wmem_max = 16777216” >> /etc/sysctl.conf
#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
echo “net.core.netdev_max_backlog = 262144” >> /etc/sysctl.conf
#web 应用中 listen 函数的 backlog 默认会给我们内核参数的net.core.somaxconn 限制到128,而nginx定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值。
#注:对于一个TCP连接,Server与Client需要通过三次握手来建立网络连接.当三次握手成功后,我们可以看到端口的状态由LISTEN转变为ESTABLISHED,接着这条链路上就可以开始传送数据了.每一个处于监听(Listen)状态的端口,都有自己的监听队列.监听队列的长度与如somaxconn参数和使用该端口的程序中listen()函数有关
#somaxconn参数:定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128,对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。
echo “net.core.somaxconn = 40960” >> /etc/sysctl.conf
echo “net.ipv4.tcp_max_orphans = 3276800” >> /etc/sysctl.conf
#这个参数标示TCP三次握手建立阶段接受SYN请求队列的最大长度,默认为1024,将其设置得大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的连接请求。
echo “net.ipv4.tcp_max_syn_backlog = 262144” >> /etc/sysctl.conf
echo “net.ipv4.tcp_timestamps = 0” >> /etc/sysctl.conf
echo “net.ipv4.tcp_synack_retries = 1” >> /etc/sysctl.conf
echo “net.ipv4.tcp_syn_retries = 1” >> /etc/sysctl.conf
#启用timewait快速回收
echo “net.ipv4.tcp_tw_recycle = 1” >> /etc/sysctl.conf
#开启重用 允许将TIME-WAIT sockets重新用于新的TCP连接。这对于服务器来说很有意义,因为服务器上总会有大量TIME-WAIT状态的连接。
echo “net.ipv4.tcp_tw_reuse = 1” >> /etc/sysctl.conf
echo “net.ipv4.tcp_mem = 94500000 915000000 927000000” >> /etc/sysctl.conf
echo “net.ipv4.tcp_fin_timeout = 1” >> /etc/sysctl.conf
#这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置的小一些,可以更快地清理无效的连接。
echo “net.ipv4.tcp_keepalive_time = 30” >> /etc/sysctl.conf
#允许系统打开的端口范围
echo “net.ipv4.ip_local_port_range = 1024 65000” >> /etc/sysctl.conf
7、自动对磁盘分区、格式化、挂载
#!/bin/bash
for i in /sys/class/scsi_host/host*/scan
do
echo “- - -” > $i
done
echo "n
p
w" | fdisk /dev/sdb
mkfs -t xfs /dev/sdb1
mkdir -p /home/cs
mount /dev/sdb1 /home/cs
mount -a
df -Th
8、统计/var/log 有多少个文件,并显示这些文件名
#!/bin/bash
echo “文件总数:”
ls -ah /var/log | wc -l
echo “文件名:”
ls -ah /var/log
9、编写一个点名器脚本
#!/bin/bash
set -x
a=
(
d
a
t
e
+
b
=
(date +%N) b=
(date+b=(expr $a % 35)
echo “学号:”
(
(
((
((b+1))
10、使用死循环实时显示 eth0 网卡发送的数据包流量
#!/bin/bash
while true
do
#ifconfig ens33 查看数据流量流向
r=ifconfig ens33 | grep "RX packets" | awk '{print $5}' #输出流量大小
echo “接收的流量包为:$r”
f=ifconfig ens33 | grep "TX packets" | awk '{print $5}'
echo “发送的流量包为:$f”
sleep 4
done
11、编写脚本,实现人机<石头,剪刀,布>游戏
#!/bin/bash
#set -x
caiquan(){
echo “1:剪刀”
echo “2:石头”
echo “3:布”
}
caiquan
read -p “请输入选项(1,2,3):” R
while [ “
R
"
=
"
1
"
−
o
"
R"="1" -o "
R"="1"−o"R”=“2” -o "
R
"
=
"
3
"
]
d
o
N
U
M
=
R"="3" ] do NUM=
R"="3"]doNUM=[$(expr $RANDOM % 3) +1]
case $NUM in
1)
echo “机器人出剪刀”
if [ $R -eq 1 ];then
echo “平局”
elif [ $R -eq 2 ];then
echo “你赢了”
elif [ $R -eq 3 ];then
echo “你输了”
fi
;;
2)
echo “机器人出石头”
if [ $R -eq 2 ];then
echo “平局”
elif [ $R -eq 3 ];then
echo “你赢了”
elif [ $R -eq 1 ];then
echo “你输了”
fi
;;
3)
echo “机器人出布”
if [ $R -eq 3 ];then
echo “平局”
elif [ $R -eq 1 ];then
echo “你赢了”
elif [ $R -eq 2 ];then
echo “你输了”
fi
;;
esac
read -p “再来一次,输入你的选项(1,2,3或者q退出):” R
done
12、依次提示用户输入 3 个整数,脚本根据数字大小依次排序输出 3 个数字
#!/bin/bash
#冒泡排序法(从大到小)
#set -x
echo “请输入3个数:”
read -a array #-a输入到array数组中
length=KaTeX parse error: Expected '}', got '#' at position 2: {#̲array[*]} #{#array[*]}获取数组的长度
for((i=0;i<
[
[
[length-1];i++)) #一共比较length-1趟
do
for((j=0;j<
[
[
[length-1-i];j++)) #每趟每次比较length-1-i次
do
if [ ${array[j]} -lt
a
r
r
a
y
[
j
+
1
]
]
t
h
e
n
t
e
m
p
=
{array[j+1]} ] then temp=
array[j+1]]thentemp={array[j]}
array[j]=
a
r
r
a
y
[
j
+
1
]
a
r
r
a
y
[
j
+
1
]
=
{array[j+1]} array[j+1]=
array[j+1]array[j+1]=temp
fi
done
done
#输出排序完后的数组
for((i=0;i<
l
e
n
g
t
h
;
i
+
+
)
)
d
o
e
c
h
o
"
length;i++)) do echo "
length;i++))doecho"{array[i]}"
done
13、根据计算机当前时间,返回问候语,可以将该脚本设置为开机启动
#!/bin/bash
a=
(
d
a
t
e
+
b
=
(date +%H) #显示小时 b=
(date+b=(date +%T) #显示时间
echo $b
if [ $a -ge 0 ] && [ $a -lt 6 ];then
echo “凌晨好”
elif [ $a -ge 6 ] && [ $a -lt 12 ];then
echo “早上好”
elif [ $a -ge 12 ] && [ $a -lt 14 ];then
echo “中午好”
elif [ $a -ge 14 ] && [ $a -lt 18 ];then
echo “下午好”
elif [ $a -ge 18 ] && [ $a -lt 24 ];then
echo “晚上好”
fi
14、从键盘读取一个论坛积分,判断论坛用户等级
#!/bin/bash
read -p “积分等级一共为100级,请输入你的积分等级(0-100):” num
if [ $num -eq 100 ];then
echo “你以天下无敌,燥起来。”
elif [ $num -ge 90 -a $num -lt 100 ];then
echo “你以炉火纯青。”
elif [ $num -ge 80 -a $num -lt 90 ];then
echo “你是个高手。”
elif [ $num -ge 70 -a $num -lt 80 ];then
echo “你离高手不远了。”
elif [ $num -ge 60 -a $num -lt 70 ];then
echo “小小新秀加油。”
else
echo “祝你尽早脱离菜鸟新手。”
fi
15、统计 Linux 进程相关数量信息
#!/bin/bash
total=0 #总进程数
running=0 #正在运行的进程的个数
sleeping=0 #休眠进程的个数
stoped=0 #停止运行的进程的个数
zombie=0 #僵尸进程的个数
for pid in /proc/[1-9]* # 在 proc 目录下所有以数字开始的都是当前计算机正在运行的进程的进程 PID
#每个 PID 编号的目录下记录有该进程相关的信息
do
total=
[
t
o
t
a
l
+
1
]
s
t
a
t
=
[total+1] stat=
[total+1]stat=(awk ‘{print $3}’ $pid/stat)# 每个 pid 目录下都有一个 stat 文件,该文件的第 3 列是该进程的状态信息
case
s
t
a
t
i
n
R
)
r
u
n
n
i
n
g
=
stat in R) running=
statinR)running=[running+1]
;;
T)
stoped=
[
s
t
o
p
e
d
+
1
]
;
;
S
)
s
l
e
e
p
i
o
n
g
=
[stoped+1] ;; S) sleepiong=
[stoped+1];;S)sleepiong=[sleeping+1]
;;
Z)
zombie=
[
z
o
m
b
i
e
+
1
]
;
;
e
s
a
c
d
o
n
e
e
c
h
o
"
总
进
程
数
:
"
[zombie+1] ;; esac done echo "总进程数:"
[zombie+1];;esacdoneecho"总进程数:"total
echo "正在运行的进程数:"
r
u
n
n
i
n
g
e
c
h
o
"
正
在
休
眠
的
进
程
数
:
"
running echo "正在休眠的进程数:"
runningecho"正在休眠的进程数:"sleeping
echo "已停止运行的进程数:"
s
t
o
p
e
d
e
c
h
o
"
僵
尸
进
程
数
:
"
stoped echo "僵尸进程数:"
stopedecho"僵尸进程数:"zombie
16、批量下载有序文件(pdf、图片、视频等等)
#!/bin/bash
#这道题前提是要有httpd服务的开启,先可以在外面试下curl http://www.baidu.com看是否能访问我这里不做了
url=“http://www.baidu.com”
type1=jpg #下载的图片类型
type2=pdf #下载的pdf
type3=mp4 #下载的视屏类型
echo “开是下载请稍后…”
sleep 2
for((i=1;i<=10;i++))
do
echo “正在下载
i
.
i.
i.type1,
i
.
i.
i.type2,
i
.
i.
i.type3”
#curl 使用 -o 选项指定文件下载保存到/home目录下
curl
u
r
l
/
url/
url/i.
t
y
p
e
1
−
o
/
h
o
m
e
/
type1 -o /home/
type1−o/home/{i}$type1 #在http://www.baidu.com中下载1.jpg保存到/home目录下
curl
u
r
l
/
url/
url/i.
t
y
p
e
2
−
o
/
h
o
m
e
/
type2 -o /home/
type2−o/home/{i}$type2
curl
u
r
l
/
url/
url/i.
t
y
p
e
3
−
o
/
h
o
m
e
/
type3 -o /home/
type3−o/home/{i}$type3
sleep 1
done
17、生成随机密码(字串截取版本)
#!/bin/bash
#定义密码库
#set -x
key=“0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”
len_key=KaTeX parse error: Expected '}', got '#' at position 2: {#̲key} #密码库的长度62 …[RANDOM%len_key] #生成一个随机数(0-61)
pass=KaTeX parse error: Expected '}', got 'EOF' at end of input: {key:index:1} #key(密码库):KaTeX parse error: Expected 'EOF', got '#' at position 45: … #̲生成的随机数对应密码库里的位置…pass #8个字母或者数字组合成一个密码
done
echo $password
18、监控 HTTP 服务器的状态(测试返回码
#!/bin/bash
ps -aux | grep httpd | grep -v grep
if [ $? -eq 0 ]
then
echo “httpd服务已开启”
exit 100 #结果退出后通过echo $?检测
else
echo “httpd服务未开启”
exit 10
fi
19、每天定时备份A文件(可以任意)到目标backup文件中,备份时间是为凌晨3点并且删除改文件夹下超过30天的文件。
#!/bin/bash
#每天定时备份/home/ky17/dc.txt到目标/home/backup文件中备份时间是为凌晨3点并且删除改文件夹下超过30天的文件。
#文件名称为当天时间
time=date '+%y-%m-%d'
echo $time
echo “开始备份数据库…”
A=/home/ky17/1.txt
B=/home/backup
cp $A B / B/ B/time.txt
#拷贝文件
echo “数据库备份完成”
find $B -type f -mtime +30 -exec rm -rf {} ;
grep
if [ $? -eq 0 ]
then
echo “httpd服务已开启”
exit 100 #结果退出后通过echo $?检测
else
echo “httpd服务未开启”
exit 10
fi
19、每天定时备份A文件(可以任意)到目标backup文件中,备份时间是为凌晨3点并且删除改文件夹下超过30天的文件。
#!/bin/bash
#每天定时备份/home/ky17/dc.txt到目标/home/backup文件中备份时间是为凌晨3点并且删除改文件夹下超过30天的文件。
#文件名称为当天时间
time=date '+%y-%m-%d'
echo $time
echo “开始备份数据库…”
A=/home/ky17/1.txt
B=/home/backup
cp $A B / B/ B/time.txt
#拷贝文件
echo “数据库备份完成”
find $B -type f -mtime +30 -exec rm -rf {} ;
#计划任务里面写入此脚本
浙公网安备 33010602011771号