巡检日志脚本报错排查+实战优化|AI+Linux实战营
大家好,这里是「运维AI实战营」,专注 AI+Linux 自动化运维实战。昨天我们正式发布了《AI一键生成服务器定时巡检+日志脚本》,收到了很多粉丝的反馈——大部分同学已经成功部署,实现了服务器自动巡检、日志自动留存,但也有不少新手同学遇到了各种报错,比如EOF语法错误、定时任务失效、日志写入失败等。
今天这篇,不发新脚本,只解决「实战痛点」:把大家反馈的高频报错逐一拆解,给出一步到位的解决方案,同时补充3个实用优化技巧,让你的巡检脚本更稳定、更贴合企业级运维场景,新手也能轻松搞定,彻底避开所有坑!
另外,文末会同步下一篇「异常报警脚本」的最新进展,提前锁定福利,别错过~
一、前言:为什么要做报错排查+优化?
- • 很多运维新手会有一个误区:拿到脚本复制执行,能运行就万事大吉,遇到报错就手足无措。但实际上,服务器巡检脚本是运维日常的核心工具,一旦报错或运行不稳定,会导致巡检中断、日志丢失,甚至错过服务器异常的最佳排查时机。
- • 昨天发布的脚本虽已实测零报错,但受服务器配置、操作习惯、命令环境等影响,部分同学仍会遇到小问题。今天我们就针对性解决这些问题,同时优化脚本细节,让脚本:
- • ✅ 报错率降至0,适配不同CentOS版本(7/8通用)
话不多说,直接上干货——高频报错排查+脚本优化,全程实战,复制就能用!
二、高频报错排查(4大报错,逐一解决,零技术门槛)
结合昨天粉丝反馈的问题,整理了4个最常见的报错,每个报错都标注「报错现象+报错原因+解决方案」,无需复杂排查,对照操作就能解决。
2.1 报错1:cat命令创建脚本,报「EOF encountered in a comment」
【报错现象】
复制cat命令转义版脚本后,执行时提示「EOF encountered in a comment」「syntax error near unexpected token `newline'」,脚本无法创建。
【报错原因】
核心原因:复制脚本时,不小心遗漏了部分内容(尤其是EOF结尾),或终端编码格式异常,导致cat命令无法识别脚本结束标记;也可能是手动修改脚本时,误删了转义符号「\」。
【解决方案】(3种方法,优先方法1,零报错)
- 1. 方法1:放弃cat命令,用vi创建(推荐)执行命令 vi server-check.sh,按i进入编辑模式,复制文章末尾「优化版完整脚本」,粘贴后按Esc,输入:wq保存,直接避开EOF报错。
- 2. 方法2:重新复制cat转义版脚本务必完整复制文章中的「cat命令转义版脚本」,从「cat > server-check.sh <<EOF」开始,到「EOF」结束,不要遗漏任何一行,复制后直接粘贴到终端执行。
- 3. 方法3:手动补充转义符号若已创建脚本,打开脚本 vi server-check.sh,检查所有「$」符号前是否有「\」(转义版脚本必须有),缺少的手动补充,保存后重新执行。
💡 避坑提醒:新手优先用方法1,彻底避开EOF报错,无需纠结转义问题。
2.2 报错2:定时任务不执行,无任何日志生成
【报错现象】
设置crontab定时任务后,到指定时间脚本不执行,查看日志目录「server-check-logs」,无当日日志生成,手动运行脚本却能正常执行。
【报错原因】
- 1. 定时任务中,脚本路径写的是相对路径(如「./server-check.sh」),crontab执行时无法识别相对路径;
- 3. crontab执行环境缺少必要命令(极少出现,CentOS7/8默认自带)。
【解决方案】(一步到位,确保定时生效)
- 1. 查看脚本绝对路径:执行命令pwd,获取脚本所在目录(如「/root/ai-scripts」),则脚本绝对路径为「/root/ai-scripts/server-check.sh」。
- 2. 重新编辑定时任务:执行 crontab -e,将原有内容替换为(替换为你的绝对路径):0 2 * * * /root/ai-scripts/server-check.sh
- 3. 重启crontab服务:执行以下两条命令,确保定时任务生效:systemctl restart crondsystemctl enable crond(开机自启,避免重启服务器后失效)
- 4. 测试定时任务:可将定时时间改为当前时间+1分钟(如当前14:30,改为「31 14 * * *」),等待时间到后,查看日志目录是否生成日志。
2.3 报错3:日志写入失败,提示「Permission denied」
【报错现象】
手动运行脚本时,提示「./server-check.sh: line 15: ./server-check-logs/2026-03-11-server-check.log: Permission denied」,日志无法写入。
【报错原因】
日志目录「server-check-logs」的权限不足,脚本无法写入日志;或当前用户无权限操作该目录(如用普通用户执行脚本,目录为root用户创建)。
【解决方案】(两种方法,按需选择)
- 1. 方法1:赋予日志目录权限(推荐)执行命令:chmod 777 ./server-check-logs,临时赋予目录最高权限,脚本可正常写入日志;若想更安全,可执行chmod 755 ./server-check-logs,赋予读写执行权限。
- 2. 方法2:更换日志保存路径打开脚本 vi server-check.sh,将「LOG_PATH="./server-check-logs"」改为有权限的路径(如「LOG_PATH="/tmp/server-check-logs"」),保存后重新执行脚本,系统会自动创建新目录。
2.4 报错4:CPU使用率显示0.0%,怀疑脚本故障
【报错现象】
脚本运行后,查看日志发现CPU使用率显示「0.0%」或「0.3%」,担心脚本采集数据异常,无法准确监测CPU状态。
【报错原因】
这不是脚本故障!是服务器空闲时,CPU负载极低,脚本采集3次取平均后,数值接近0,属于正常现象;若服务器有负载(如运行程序、执行命令),CPU使用率会自动显示正常数值。
【解决方案】(验证脚本有效性,消除顾虑)
- 1. 手动模拟CPU负载:执行命令 dd if=/dev/zero of=/dev/null,该命令会占用大量CPU资源。
- 2. 重新运行脚本:执行 ./server-check.sh,查看日志,此时CPU使用率会显示正常数值(如20%、50%),证明脚本采集功能正常。
- 3. 停止CPU负载:按「Ctrl+C」停止上述命令,CPU使用率会恢复正常。
- • 💡 提示:脚本采集3次CPU使用率取平均,就是为了避免空闲时0值误判,无需担心数据准确性。
三、巡检脚本实战优化(3个技巧,提升脚本实用性)
解决完报错,我们再对脚本进行3个实用优化,让脚本更贴合企业级运维场景,使用更便捷、日志更规范,无需复杂修改,复制优化后的脚本即可直接使用。
3.1 优化1:新增日志过期清理功能,避免磁盘占满
【优化背景】:脚本每天生成1个日志文件,长期运行后,日志文件会越来越多,占用磁盘空间,尤其是磁盘容量较小的服务器,可能导致磁盘爆满。
【优化方案】:在脚本末尾添加日志清理代码,自动删除7天前的日志文件,无需手动清理。
【新增代码】(添加在脚本最后一行):
# 新增:自动清理7天前的日志文件,避免磁盘占满find $LOG_PATH -name "*.log" -mtime +7 -deleteecho "📌 已自动清理7天前的巡检日志" >> "$LOG_FILE"
3.2 优化2:新增脚本运行状态日志,便于排查故障
【优化背景】:若脚本运行失败(如权限不足、命令异常),无任何状态提示,难以排查故障原因。
【优化方案】:新增脚本运行状态判断,若脚本正常执行,在日志中添加「脚本运行正常」标记;若执行失败,终端提示报错信息,并写入日志。
【新增代码】(添加在日志清理代码前):
# 新增:脚本运行状态判断if [ $? -eq 0 ]; then echo "【脚本状态】: 运行正常✅" >> "$LOG_FILE"else echo "【脚本状态】: 运行失败❌,请检查脚本权限或命令环境" >> "$LOG_FILE" echo "❌ 脚本运行失败,请检查以下内容:1. 脚本权限 2. 命令是否存在 3. 日志目录权限"fi
3.3 优化3:自定义巡检时间提示,适配不同运维场景
【优化背景】:不同服务器的运维低峰期不同,部分同学将定时时间改为非凌晨2点,却忘记在日志中标注,后续查看日志时,无法确认巡检时间是否符合预期。
【优化方案】:在脚本开头添加巡检时间说明,标注当前定时巡检时间,便于后续查看和调整。
【新增代码】(添加在脚本注释后):
# 巡检时间说明(可根据实际定时时间修改)echo "【巡检时间说明】: 本脚本定时执行时间为每天凌晨2点(可在crontab中修改)" >> "$LOG_FILE"
四、优化版完整脚本(零报错,直接复制可用)
整合上述报错解决方案和优化技巧,整理出优化版完整脚本,兼容CentOS7/8,零依赖、零报错,包含日志清理、状态判断、时间提示等功能,直接复制执行即可,无需二次修改。
⚠️ 重点提醒:优先用vi创建脚本,避开EOF报错;若用cat命令,需复制下方转义版脚本。
4.1 vi创建版(推荐,零报错)
#!/bin/bash# 服务器定时巡检+日志自动记录脚本(优化版,零报错)# 日志保存路径(可自定义,默认当前目录)LOG_PATH="./server-check-logs"# 日志文件名(按日期命名)LOG_FILE="${LOG_PATH}/$(date '+%Y-%m-%d')-server-check.log"# 1. 创建日志目录(不存在则创建,避免报错)if [ ! -d "$LOG_PATH" ]; then mkdir -p "$LOG_PATH" chmod 755 "$LOG_PATH" # 赋予目录权限,避免日志写入失败fi# 2. 写入巡检日志(带时间戳,便于追溯)echo "=================================================" >> "$LOG_FILE"echo "【巡检时间】: $(date '+%Y-%m-%d %H:%M:%S')" >> "$LOG_FILE"echo "【巡检时间说明】: 本脚本定时执行时间为每天凌晨2点(可在crontab中修改)" >> "$LOG_FILE"echo "=================================================" >> "$LOG_FILE"# 3. 采集CPU使用率(采集3次取平均,避免服务器空闲时0值误判)cpu_usage=$(top -bn3 | grep 'Cpu(s)' | awk '{sum+=$2} END {print sum/3}' | cut -d. -f1).$(top -bn3 | grep 'Cpu(s)' | awk '{sum+=$2} END {print sum/3}' | cut -d. -f2 | cut -c1)echo "【CPU使用率】: ${cpu_usage}%" >> "$LOG_FILE"# 4. 采集内存信息(清晰显示总量、已用、使用率,直观易懂)mem_total=$(free -m | grep Mem | awk '{print $2}')mem_used=$(free -m | grep Mem | awk '{print $3}')mem_usage=$(echo "scale=1; $mem_used/$mem_total*100" | bc)echo "【内存信息】: 总量${mem_total}MB | 已用${mem_used}MB | 使用率${mem_usage}%" >> "$LOG_FILE"# 5. 采集磁盘信息(过滤临时分区,只显示核心磁盘,避免冗余)echo "【磁盘信息】:" >> "$LOG_FILE"df -h | grep -E '^/dev/' | grep -v tmpfs | awk '{print " 磁盘:" $1 " | 使用率:" $5 " | 挂载点:" $6}' >> "$LOG_FILE"# 6. 脚本运行状态判断if [ $? -eq 0 ]; then echo "【脚本状态】: 运行正常✅" >> "$LOG_FILE"else echo "【脚本状态】: 运行失败❌,请检查脚本权限或命令环境" >> "$LOG_FILE" echo "❌ 脚本运行失败,请检查以下内容:1. 脚本权限 2. 命令是否存在 3. 日志目录权限"fi# 7. 自动清理7天前的日志文件,避免磁盘占满find $LOG_PATH -name "*.log" -mtime +7 -deleteecho "📌 已自动清理7天前的巡检日志" >> "$LOG_FILE"# 8. 巡检结束标记(便于区分每次巡检记录,提升日志可读性)echo "【巡检状态】: 完成✅" >> "$LOG_FILE"echo "----------------------------------------" >> "$LOG_FILE"echo "" >> "$LOG_FILE" # 日志换行,避免多条记录粘连# 9. 终端提示(手动运行时显示,快速查看日志路径)echo "✅ 巡检完成!"echo "📌 日志保存路径:$LOG_FILE"echo "📌 查看日志命令:cat $LOG_FILE"echo "📌 提示:已自动清理7天前日志,脚本运行状态可在日志中查看"
4.2 cat命令转义版(避免EOF报错)
cat > server-check.sh <<EOF#!/bin/bash# 服务器定时巡检+日志自动记录脚本(优化版,零报错)# 日志保存路径(可自定义,默认当前目录)LOG_PATH="./server-check-logs"# 日志文件名(按日期命名)LOG_FILE="\${LOG_PATH}/\$(date '+%Y-%m-%d')-server-check.log"# 1. 创建日志目录(不存在则创建,避免报错)if [ ! -d "\$LOG_PATH" ]; then mkdir -p "\$LOG_PATH" chmod 755 "\$LOG_PATH" # 赋予目录权限,避免日志写入失败fi# 2. 写入巡检日志(带时间戳,便于追溯)echo "=================================================" >> "\$LOG_FILE"echo "【巡检时间】: \$(date '+%Y-%m-%d %H:%M:%S')" >> "\$LOG_FILE"echo "【巡检时间说明】: 本脚本定时执行时间为每天凌晨2点(可在crontab中修改)" >> "\$LOG_FILE"echo "=================================================" >> "\$LOG_FILE"# 3. 采集CPU使用率(采集3次取平均,避免服务器空闲时0值误判)cpu_usage=\$(top -bn3 | grep 'Cpu(s)' | awk '{sum+=\$2} END {print sum/3}' | cut -d. -f1).\$(top -bn3 | grep 'Cpu(s)' | awk '{sum+=\$2} END {print sum/3}' | cut -d. -f2 | cut -c1)echo "【CPU使用率】: \${cpu_usage}%" >> "\$LOG_FILE"# 4. 采集内存信息(清晰显示总量、已用、使用率,直观易懂)mem_total=\$(free -m | grep Mem | awk '{print \$2}')mem_used=\$(free -m | grep Mem | awk '{print \$3}')mem_usage=\$(echo "scale=1; \$mem_used/\$mem_total*100" | bc)echo "【内存信息】: 总量\${mem_total}MB | 已用\${mem_used}MB | 使用率\${mem_usage}%" >> "\$LOG_FILE"# 5. 采集磁盘信息(过滤临时分区,只显示核心磁盘,避免冗余)echo "【磁盘信息】:" >> "\$LOG_FILE"df -h | grep -E '^/dev/' | grep -v tmpfs | awk '{print " 磁盘:" \$1 " | 使用率:" \$5 " | 挂载点:" \$6}' >> "\$LOG_FILE"# 6. 脚本运行状态判断if [ \$? -eq 0 ]; then echo "【脚本状态】: 运行正常✅" >> "\$LOG_FILE"else echo "【脚本状态】: 运行失败❌,请检查脚本权限或命令环境" >> "\$LOG_FILE" echo "❌ 脚本运行失败,请检查以下内容:1. 脚本权限 2. 命令是否存在 3. 日志目录权限"fi# 7. 自动清理7天前的日志文件,避免磁盘占满find \$LOG_PATH -name "*.log" -mtime +7 -deleteecho "📌 已自动清理7天前的巡检日志" >> "\$LOG_FILE"# 8. 巡检结束标记(便于区分每次巡检记录,提升日志可读性)echo "【巡检状态】: 完成✅" >> "\$LOG_FILE"echo "----------------------------------------" >> "\$LOG_FILE"echo "" >> "\$LOG_FILE" # 日志换行,避免多条记录粘连# 9. 终端提示(手动运行时显示,快速查看日志路径)echo "✅ 巡检完成!"echo "📌 日志保存路径:\$LOG_FILE"echo "📌 查看日志命令:cat \$LOG_FILE"echo "📌 提示:已自动清理7天前日志,脚本运行状态可在日志中查看"EOF
五、优化版脚本使用方法(与原脚本一致,无需重新学习)
优化版脚本仅新增功能,使用方法与原脚本完全一致,已部署原脚本的同学,可直接替换脚本内容,无需重新设置定时任务:
- 1. 创建脚本:用vi创建(推荐)或cat命令创建,复制优化版脚本粘贴保存;
- 2. 赋予权限:执行 chmod +x server-check.sh;
- 3. 测试脚本:执行 ./server-check.sh,查看终端提示和日志,确认正常运行;
- 4. 定时任务:若已设置定时任务,无需修改;若未设置,按原步骤设置即可。
💡 提示:已部署原脚本的同学,直接用优化版脚本替换原文件(覆盖),定时任务会自动执行优化版脚本,无需额外操作。
六、下一篇预告
6.1 互动话题(来评论区打卡)
📢 来评论区反馈:你是否遇到了上述报错?优化版脚本是否能正常运行?✅ 成功部署优化版脚本的同学,评论区回复「优化成功」,抽取3位粉丝,提前发送下一篇「异常报警脚本」内测版;❓ 仍有报错的同学,直接贴出报错信息,我会第一时间帮你解决!
6.2 下一篇预告(明日发布)
🔔 重点预告:解决了巡检脚本的报错和优化问题,下一篇我们将兑现承诺,发布《AI一键生成服务器异常报警脚本》!✅ 对接本次优化版巡检脚本,实现「自动巡检+异常报警」完整闭环;✅ CPU/内存/磁盘超阈值,自动红色高亮终端报警,一眼识别故障;✅ 自定义阈值,适配不同服务器配置,零报错可直接落地;✅ 无需实时盯屏,异常情况及时提醒,彻底解放运维双手!
关注不迷路,明天晚上21点,准时发布,评论区留言,可提前锁定脚本,优先获取内测版!