脚本19练

文章目录

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"gt40o"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 "报警时间: shanchaunggt10000]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/ type1o/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/ type2o/home/{i}$type2
curl u r l / url/ url/i. t y p e 3 − o / h o m e / type3 -o /home/ type3o/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 {} ;

#计划任务里面写入此脚本

posted @ 2022-03-07 18:09  叕叕666  阅读(84)  评论(0)    收藏  举报