Apache连接数超限自动重启Bash脚本报错求助
Apache进程数超限自动重启脚本修复方案
你的脚本存在两个核心错误导致运行异常,以下是修正后的完整脚本及问题解析:
修正后的脚本
#!/bin/bash RESTART="systemctl restart httpd" # 执行命令并捕获输出,同时过滤掉grep自身进程 COUNT=$(ps aux | grep httpd | grep -v grep | wc -l) # 更简洁准确的替代写法:COUNT=$(pgrep httpd | wc -l) SERVICE="httpd" LOGFILE="/opt/httpd/autostart-apache2.log" # 用数值比较语法判断进程数是否超限 if [ $COUNT -gt 45 ]; then echo "重启Apache于 $(date)" >> $LOGFILE $RESTART >> $LOGFILE 2>&1 # 把错误输出也写入日志,方便排查问题 else echo "Apache运行正常,当前进程数:$COUNT,时间:$(date)" >> $LOGFILE # 建议写入日志便于跟踪 fi
错误解析与修正点
变量赋值错误
原脚本中COUNT="ps aux | grep httpd | wc -l"只是把命令字符串存进变量,没有执行命令获取真实进程数。必须用$(命令)或反引号`命令`执行命令并捕获输出,才能得到正确的数值。条件判断错误
原脚本if COUNT > 45会被Bash误解为执行名为COUNT的命令,同时将输出重定向到文件45,这就是报错COUNT: command not found的原因。
Bash中数值比较需用两种语法:- 方括号语法:
[ $COUNT -gt 45 ](-gt表示大于,类似的还有-lt小于、-eq等于) - 双括号语法:
(( COUNT > 45 ))(更贴近常规编程语言的写法)
- 方括号语法:
额外优化:排除无效进程
原ps aux | grep httpd会把执行grep的进程也统计进去,导致进程数多算1个。添加grep -v grep可过滤掉grep自身,或者直接用pgrep httpd | wc -l,后者只会匹配进程名为httpd的进程,结果更准确。日志完善
建议将else分支的状态也写入日志,同时在重启命令后添加2>&1,把错误输出追加到日志,方便后续排查重启失败的原因。
内容的提问来源于stack exchange,提问作者user3526312
相关产品推荐
相关产品推荐

