shell脚本拔高习题
1. 磁盘监控告警
需求:
编写一个Shell脚本,监控系统的磁盘空间,并在磁盘使用超过80%时发送警告邮件。
思路:
-
使用
df
命令获取磁盘空间使用情况。 -
提取磁盘的使用率信息。
-
判断磁盘的使用率是否超过80%。
-
如果超过80%,则使用echo弹出提示信息
#!/bin/bash
# 磁盘告警
# 编写一个shell脚本,监控系统的磁盘空间,并在磁盘使用超过80%时发送告警邮件
### 思路:
# 1. 使用`df`命令获取磁盘空间使用情况。
# 2. 提取磁盘的使用率信息。
# 3. 判断磁盘的使用率是否超过80%。
# 4. 如果超过80%,则使用echo弹出提示信息
# 定义一个阈值
dev=20
# 获取磁盘使用情况
dev_condition=$(df / | grep "^/dev/" | tr -s ' ' | cut -d ' ' -f5 | tr -d '%')
# 判断
if [ $dev_condition -gt $dev ] ; then
echo "磁盘使用率过高"
fi
2. cpu负载监控
需求:
编写一个Shell脚本,监控系统的CPU负载,并在负载过高时发送警告。
思路:
-
使用
uptime
命令获取系统的负载信息。 -
提取1分钟、5分钟、15分钟的负载信息。
-
如果负载超过设定阈值(例如:4.0),则弹出告警信息
#!/bin/bash
## 2. cpu负载监控
### 需求:
# 编写一个Shell脚本,监控系统的CPU负载,并在负载过高时发送警告。
### 思路:
# 1. 使用`uptime`命令获取系统的负载信息。
# 2. 提取1分钟、5分钟、15分钟的负载信息。
# 3. 如果负载超过设定阈值(例如:4.0),则弹出告警信息
# cpu负载信息
cpu=&(uptime | tr -s ' ' | cut -d ' ' -f9 | tr -d ',')
# 阈值
threshold=4.0
if (( $(echo "$cpu > $threshold" | bc -l) ));then
echo "cpu负载过高,超过了阈值$threshold"
fi
3. 日志文件清理
需求:
编写一个Shell脚本,定期清理系统日志文件。
思路:
-
使用
find
命令查找/var/log
目录下超过30天的日志文件。 -
删除这些过期日志文件。
#!/bin/bash
# 3. 日志文件清理
# 需求:
# 编写一个Shell脚本,定期清理系统日志文件。
# 思路:
# 1. 使用`find`命令查找`/var/log`目录下超过30天的日志文件。
# 2. 删除这些过期日志文件。
find /var/log -type f -name '*.log' -mtime '+30' -delete
4. 服务状态检查脚本
需求:
编写一个Shell脚本,检查指定服务(如nginx
)的状态,并在服务未启动时重启它。
思路:
-
使用
systemctl
检查服务状态。 -
如果服务停止,使用
systemctl start
启动服务。 -
记录操作结果。
#!/bin/bash
# 4. 服务状态检查脚本
# 需求:
# 编写一个Shell脚本,检查指定服务(如`nginx`)的状态,并在服务未启动时重启它。
# 思路:
# 1. 使用`systemctl`检查服务状态。
# 2. 如果服务停止,使用`systemctl start`启动服务。
# 3. 记录操作结果
# 服务状态
check_nginx=$(systemctl is-active nginx)
# 判断
if [ $check_nginx = "inactive" ];then
systemctl start nginx
echo "nginx状态为$check_nginx,已启动"
else
echo "nginx已启动"
fi
5. 网络端口监控脚本
需求:
编写一个Shell脚本,检查系统中指定端口的监听情况,并在端口未开放时发送警告。
思路:
-
使用
netstat
或ss
命令检查端口(如80、443、22等)的监听状态。 -
如果指定端口未开放,则弹出提示
#!/bin/bash
# 5. 网络端口监控脚本
# 需求:
# 编写一个Shell脚本,检查系统中指定端口的监听情况,并在端口未开放时发送警告。
# 思路:
# 1. 使用`netstat`或`ss`命令检查端口(如80、443、22等)的监听状态。
# 2. 如果指定端口未开放,则弹出提示
port_state=$(ss -tuln | grep ':80')
if [ $? -eq 0 ];then
echo "端口已经开放"
else
echo "端口:80未开放"
fi
6. 检查文件是否存在
需求:
编写一个Shell脚本,检查指定的文件/etc/nginx/nginx.conf是否存在。如果存在,输出“文件存在”,否则输出“文件不存在”。
思路:
-
使用
-f
选项判断文件是否存在。
#!/bin/bash
# 6. 检查文件是否存在
# 需求:
# 编写一个Shell脚本,检查指定的文件/etc/nginx/nginx.conf是否存在。
# 如果存在,输出“文件存在”,否则输出“文件不存在”。
file_exist=$(tail -10 /etc/nginx/nginx.conf)
if [ $? -eq 0 ];then
echo "文件存在"
else
echo "文件不存在"
fi
7. 计算两个数的和
需求:
编写一个Shell脚本,接受两个整数作为输入,计算它们的和并输出。
思路:
-
使用
read
命令读取用户输入。 -
使用
expr
命令或$(( ))
进行加法计算。
#!/bin/bash
# 7. 计算两个数的和
# 需求:
# 编写一个Shell脚本,接受两个整数作为输入,计算它们的和并输出。
# 思路:
# 1. 使用`read`命令读取用户输入。
# 2. 使用`expr`命令或`$(( ))`进行加法计算。
sum=0
read -p "请输入第一个整数:" a
read -p "请输入第二个整数:" b
sum=$(expr $a + $b)
echo "两个数的和为:$sum"
8. 输出1到100之间的偶数
需求:
编写一个Shell脚本,输出1到100之间的所有偶数。
思路:
-
使用
for
循环遍历1到100。 -
使用
if
语句检查是否为偶数。
#!/bin/bash
# 8. **输出1到100之间的偶数**
# 需求:
# 编写一个Shell脚本,输出1到100之间的所有偶数。
# 思路:
# 1. 使用`for`循环遍历1到100。
# 2. 使用`if`语句检查是否为偶数。
sum=0
for i in {1..100}
do
if [ $((i%2)) -eq 0 ] ;then
echo $i
# 求偶数和
# sum=$((sum+i))
# echo "偶数和:$sum"
fi
done
9. 在指定目录中查找文件并输出文件名
需求:
编写一个Shell脚本,查找指定目录下的所有文件,并输出其文件名。
思路:
-
使用
find
命令查找文件。 -
使用
for
循环输出每个文件的名称。
#!/bin/bash
# 9.在指定目录中查找文件并输出文件名
# 需求:
# 编写一个Shell脚本,查找指定目录下的所有文件,并输出其文件名。
# 思路:
# 1. 使用`find`命令查找文件。
# 2. 使用`for`循环输出每个文件的名称。
# 提示用户输入目录路径
echo "请输入目录路径:"
read dir
# 查找目录下的所有文件并输出文件名
for file in $(find "$dir" -type f); do
echo "$file"
done
10. 检查服务状态并输出警告
需求:
编写一个Shell脚本,定义一个函数来检查某个服务的状态。如果服务未启动,输出警告信息。如果服务正常运行,输出服务的状态。
思路:
-
定义一个函数
check_service_status
,用于检查一个指定服务的状态。 -
函数使用
systemctl
命令检查服务是否运行,并返回结果。 -
主程序中直接调用该函数来检查服务状态。
#!/bin/bash
# 10. 检查服务状态并输出警告
# 需求:
# 编写一个Shell脚本,定义一个函数来检查某个服务的状态。如果服务未启动,输出警告信息。如果服务正常运行,输出服务的状态。
# 思路:
# 1. 定义一个函数`check_service_status`,用于检查一个指定服务的状态。
# 2. 函数使用`systemctl`命令检查服务是否运行,并返回结果。
# 3. 主程序中直接调用该函数来检查服务状态。
check_service_status(){
service_name=$1 # 获取服务名称
# 查看状态是否为运行状态
systemctl is-active --quiet $service_name
if [ $? -eq 0 ]; then
echo "服务 $service_name 运行正常"
else
echo "警告,服务 $service_name 运行异常"
fi
}
check_service_status nginx