当前位置: 首页 > news >正文

Shell脚本实战:文件统计与进程监控

一、基础题:统计目录下文件类型及数量

需求

写一个脚本,统计指定目录(如/home/user/docs)下不同类型文件的数量,结果按 “类型:数量” 格式输出。文件类型划分规则:

  • 普通文件(含文本、二进制等,用file标识)
  • 目录(用dir标识)
  • 软链接(用link标识)
  • 其他类型(用other标识)
核心考点
  • for循环遍历目录内容
  • 文件类型判断(-f普通文件、-d目录、-L软链接)
  • 变量计数与输出格式控制
参考解答
#!/bin/bash
# 检查是否传入目录参数
if [ $# -ne 1 ]; thenecho "用法:$0 <目标目录>"exit 1
fitarget_dir=$1
# 初始化计数变量
file_count=0
dir_count=0
link_count=0
other_count=0# 遍历目录下所有内容(*匹配所有,包括隐藏文件)
for item in "$target_dir"/* "$target_dir"/.[!.]*; do# 跳过不存在的条目(避免*未匹配到文件时的空值)[ -e "$item" ] || continueif [ -f "$item" ]; thenfile_count=$((file_count + 1))elif [ -d "$item" ]; thendir_count=$((dir_count + 1))elif [ -L "$item" ]; thenlink_count=$((link_count + 1))elseother_count=$((other_count + 1))fi
done# 输出结果
echo "file:$file_count"
echo "dir:$dir_count"
echo "link:$link_count"
echo "other:$other_count"

二、进阶题:监控进程并自动重启

需求

写一个脚本,监控指定进程(如nginx)是否在运行。如果进程不存在,自动重启该进程;如果重启后 10 秒内仍未启动,输出 “重启失败” 并退出。

核心考点
  • 进程查找(pgrep命令)
  • 条件判断(进程存在性、重启后状态)
  • 延时操作(sleep
  • 系统命令执行(systemctlservice
参考解答
#!/bin/bash
# 检查是否传入进程名参数
if [ $# -ne 1 ]; thenecho "用法:$0 <进程名>"exit 1
fiproc_name=$1# 检查进程是否存在(pgrep返回进程ID,无结果则为空)
check_proc() {pgrep "$proc_name" > /dev/null  # 重定向输出,避免干扰
}# 第一次检查进程
if check_proc; thenecho "进程$proc_name正在运行"exit 0
elseecho "进程$proc_name未运行,开始重启"# 重启命令(根据系统调整,如service/nginx restart或systemctl restart nginx)systemctl restart "$proc_name" > /dev/null 2>&1  # 重定向错误输出
fi# 等待10秒后再次检查
sleep 10
if check_proc; thenecho "进程$proc_name重启成功"
elseecho "进程$proc_name重启失败"exit 1
fi

三、综合题:日志分析与异常报警

需求

写一个脚本,分析/var/log/nginx/error.log(Nginx 错误日志),统计过去 24 小时内 “502 Bad Gateway” 错误的次数。如果次数超过 10 次,通过echo输出报警信息(实际场景可替换为邮件 / 短信),并将错误详情(含时间、请求地址)保存到/tmp/502_alarm.log

核心考点
  • 日志时间过滤(grep结合date生成时间范围)
  • 文本内容提取(awk提取关键字段)
  • 计数与阈值判断
  • 结果写入文件
参考解答
#!/bin/bash
log_path="/var/log/nginx/error.log"
alarm_path="/tmp/502_alarm.log"
threshold=10  # 错误次数阈值# 生成过去24小时的时间格式(Nginx错误日志时间格式:[26/Oct/2025:10:30:00 +0800])
# 先获取昨天的日期(格式:DD/Mon/YYYY,如25/Oct/2025)
yesterday=$(date -d "1 day ago" +"%d/%b/%Y")
# 获取今天的日期(格式同上)
today=$(date +"%d/%b/%Y")# 过滤过去24小时的502错误:包含yesterday或today的日期,且含502 Bad Gateway
# 同时提取关键信息:时间、请求地址(假设日志格式中请求地址在"request: "后)
error_detail=$(grep -E "($yesterday|$today).*502 Bad Gateway" "$log_path" | \awk -F'[][]' '{time=$2} /request: /{req=$0; sub(/.*request: /,"",req); sub(/,.*$/,"",req)} {print "时间:"time" | 请求地址:"req}')# 统计错误次数
error_count=$(echo "$error_detail" | wc -l)# 判断是否超过阈值
if [ "$error_count" -gt "$threshold" ]; then# 输出报警信息echo "【报警】Nginx 502错误次数超标!"echo "过去24小时错误次数:$error_count(阈值:$threshold)"echo "错误详情已保存至:$alarm_path"# 将详情写入报警文件(覆盖旧文件)echo "$error_detail" > "$alarm_path"
elseecho "过去24小时Nginx 502错误次数:$error_count(未超标)"
fi
http://www.dtcms.com/a/532294.html

相关文章:

  • 长沙网站开发的网站茶叶网站模板
  • STM32——按钮实验
  • 入门做外贸是先建网站还是先参展北京软件编程培训机构
  • 文案撰写网站静态网站模板古典
  • 网站建设浦东wordpress页面顶部登录
  • Linux修炼:库制作与原理(一)
  • 本地安装yolo算法环境的步骤
  • 8.1 时钟树
  • perl网站建设南宁网站定制
  • 计算机网络自顶向下方法6——应用层 进程通信与运输服务
  • HTTP 常考问题简洁回答(速记版)
  • MQTT 与 HTTP 协议对比
  • 商城网站建设视频教程wordpress教程cms
  • SZU大学物理A2实验报告-汇总链接-free
  • IOT项目——电源入门系列-第四章
  • ① leetcode刷题汇总(数组 / 字符串)
  • 网站名称填写什么晋中品牌网站建设建设
  • 宫殿记忆术AI训练系统:可扩展的终身记忆框架
  • 掌握机器学习算法及其关键超参数
  • 网站建设收费价目表织梦制作网站如何上线
  • 【传奇开心果系列】基于Flet框架实现的窗口加载显示本地图像示例自定义模板实现原理深度解析
  • 机器学习算法常用算法
  • Gorm(七)关联的Tag写法
  • 零基础理解k8s
  • *Python基础语法
  • 广东卫视你会怎么做网站化妆品网站的建设方案
  • WPF 静态样式与动态样式的定义及使用详解
  • 有没有专业做盐的网站手机wap网站程序
  • 【线程同步系列6】一个基于VC封装的多线程类CMyThread(类似QT中的QThread类的run方法)
  • python+vue旅游购票管理系统设计(源码+文档+调试+基础修改+答疑)