以下是一个用于监控Apache HTTPD(httpd)进程数的Shell脚本,可根据进程数阈值触发报警、服务重启或资源清理操作,并提供详细注释和扩展建议:
脚本功能
1、实时监控httpd进程总数
2、支持自定义进程数阈值(警告/严重)
3、触发动作:发送警报、重启服务、清理旧进程
4、自动记录监控日志
脚本代码
#!/bin/bash
# HTTPD进程监控脚本
# 配置参数
PROCESS_NAME="httpd" # 监控的进程名(根据实际调整)
WARNING_THRESHOLD=150 # 警告阈值(进程数)
CRITICAL_THRESHOLD=200 # 严重阈值(进程数)
MAX_LOG_LINES=1000 # 日志文件最大保留行数
LOG_FILE="/var/log/httpd_monitor.log" # 日志路径
ALERT_EMAIL="admin@example.com" # 告警通知邮箱
# 获取当前进程数
get_process_count() {
pgrep -c "$PROCESS_NAME" # 准确统计进程数(避免grep自身干扰)
}
# 日志管理(防止日志过大)
manage_log() {
if [ -f "$LOG_FILE" ]; then
log_lines=$(wc -l < "$LOG_FILE")
if [ "$log_lines" -gt "$MAX_LOG_LINES" ]; then
tail -n 500 "$LOG_FILE" > "${LOG_FILE}.tmp"
mv "${LOG_FILE}.tmp" "$LOG_FILE"
fi
fi
}
# 日志记录函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
# 触发警告动作
trigger_warning() {
local count=$1
log "警告: HTTPD进程数过高 (当前: $count)"
echo "HTTPD进程数警告: $count" | mail -s "HTTPD进程警报" "$ALERT_EMAIL"
}
# 触发严重状态动作
trigger_critical() {
local count=$1
log "严重: HTTPD进程数严重超标 (当前: $count),尝试重启服务"
# 1. 尝试正常重启
systemctl restart httpd || service httpd restart
# 2. 检查重启是否成功
sleep 5
if ! pgrep "$PROCESS_NAME" >/dev/null; then
log "错误: HTTPD重启失败,尝试强制清理"
pkill -9 "$PROCESS_NAME"
systemctl start httpd
fi
# 3. 发送二次通知
echo "HTTPD已强制重启" | mail -s "HTTPD紧急处理" "$ALERT_EMAIL"
}
# 主监控逻辑
monitor() {
manage_log
current_count=$(get_process_count)
if [ "$current_count" -ge "$CRITICAL_THRESHOLD" ]; then
trigger_critical "$current_count"
elif [ "$current_count" -ge "$WARNING_THRESHOLD" ]; then
trigger_warning "$current_count"
else
log "正常: HTTPD进程数正常 (当前: $current_count)"
fi
}
# 执行监控
monitor
部署与使用
1. 配置参数
根据实际环境修改 PROCESS_NAME(如使用 apache2 需改为对应进程名)
调整阈值 WARNING_THRESHOLD 和 CRITICAL_THRESHOLD
2. 设置定时任务
# 每5分钟监控一次(通过crontab -e添加)
*/5 * * * * /root/httpd_monitor.sh
3. 手动测试
# 模拟进程数超限(测试警告)
sudo bash -c "for i in {1..200}; do touch /tmp/httpd_test_$i; done"
# 查看日志
tail -f /var/log/httpd_monitor.log
扩展功能
1. 自动分析高进程数原因
# 在trigger_warning中添加以下代码
log "附加诊断:"
ps aux | grep "$PROCESS_NAME" >> "$LOG_FILE"
netstat -tnlp | grep ":80 " >> "$LOG_FILE"
top -bn1 -p $(pgrep -d ',' "$PROCESS_NAME") >> "$LOG_FILE"
2. 限制HTTPD最大进程数
# 自动调整Apache配置(需根据实际配置路径修改)
adjust_config() {
local max_clients=$((CRITICAL_THRESHOLD - 20))
sed -i "s/MaxRequestWorkers.*/MaxRequestWorkers $max_clients/" /etc/httpd/conf/httpd.conf
systemctl reload httpd
}
3. 集成监控平台
发送告警至Prometheus或Zabbix:
# 上报指标(示例)
curl -X POST -d "httpd_process_count=$current_count" http://monitor.example.com/api/metrics
注意事项
1、权限要求
脚本需以root权限运行(因涉及服务重启)
配置sudo免密(若使用非root用户):
# 在/etc/sudoers中添加
your_user ALL=(ALL) NOPASSWD: /bin/systemctl restart httpd, /bin/killall httpd
2、进程名匹配
使用 pgrep -c 替代 ps | grep -v grep | wc -l 更准确
3、服务兼容性
适配不同系统服务管理命令(如CentOS用 systemctl,Ubuntu用 service)
4、资源占用
高频监控(如每秒一次)需优化日志和命令效率
通过此脚本,您可以有效监控Apache HTTPD的进程状态,及时应对资源过载问题,保障服务稳定性。建议结合服务器性能指标(如CPU/内存)综合分析,以更精准地设定阈值。