PRTG无法显示正确值:SUSE系统更新检测脚本异常求助
可能的原因与排查思路
权限与环境问题
PRTG通常以特定用户(如prtg或root)执行脚本,需确认该用户对/var/log/zypp/history有读取权限。可以在脚本中添加调试日志,输出LASTUPDATE变量的值:echo "LASTUPDATE: '$LASTUPDATE'" >> /tmp/prtg_zypp_debug.log如果日志中
LASTUPDATE为空,说明脚本无法读取日志文件,需调整文件权限或PRTG执行用户。日期格式与
date命令兼容性
SUSE与RedHat的date命令对某些日期格式的解析可能存在差异。先确认/var/log/zypp/history中的日期格式(例如2024-05-01 14:30:00),然后在PRTG执行环境中手动测试:date -d "这里替换为实际的LASTUPDATE值" +%s如果命令报错或返回空值,说明
date无法解析该格式,需调整日期转换逻辑,比如使用awk提取日期字段后重新格式化。命令替换与排序逻辑问题
旧的反引号`...`在部分shell环境下可能存在展开问题,建议替换为$()写法:LASTUPDATE=$(grep 'install' /var/log/zypp/history | awk -F'|' '{print $1}' | sort -r | head -n 1)同时确认
sort -r能正确排序日期:如果日志中的日期格式不是字典序可排序的(如DD-MM-YYYY),sort会返回错误的最新记录,导致后续计算出错。可以手动执行这条命令,验证输出是否为最新的更新日期。添加完整调试逻辑
修改脚本加入错误处理和详细日志,定位具体出错步骤:#!/bin/sh LOGFILE=/tmp/prtg_zypp_update_debug.log echo "--- Debug Log: $(date) ---" >> "$LOGFILE" # 获取最后一次更新日期 LASTUPDATE=$(grep 'install' /var/log/zypp/history | awk -F'|' '{print $1}' | sort -r | head -n 1) echo "LASTUPDATE: '$LASTUPDATE'" >> "$LOGFILE" if [ -z "$LASTUPDATE" ]; then echo "1:0:Failed to get last update date" >> "$LOGFILE" echo "1:0:Failed to get last update date" exit 1 fi # 转换为时间戳 LASTUPDATETS=$(date -d "$LASTUPDATE" +%s 2>> "$LOGFILE") CURRENTTS=$(date +%s) echo "Timestamps - Last Update: $LASTUPDATETS, Current: $CURRENTTS" >> "$LOGFILE" if [ -z "$LASTUPDATETS" ]; then echo "1:0:Failed to convert date to timestamp" >> "$LOGFILE" echo "1:0:Failed to convert date to timestamp" exit 1 fi # 计算天数差 LASTUPDATEDAYSAGO=$(( (CURRENTTS - LASTUPDATETS) / (24 * 60 * 60) )) echo "Days since last update: $LASTUPDATEDAYSAGO" >> "$LOGFILE" echo "0:$LASTUPDATEDAYSAGO:$LASTUPDATEDAYSAGO Days since last zypper update"执行后查看
/tmp/prtg_zypp_update_debug.log,即可明确是哪一步导致LASTUPDATEDAYSAGO为0。PRTG执行环境检查
确认PRTG使用的shell路径与本地一致:执行echo $SHELL对比本地和PRTG执行环境的shell类型。如果PRTG使用的是dash而非bash,需确保脚本语法兼容POSIX标准。同时检查脚本的完整调用路径是否正确,避免PRTG找不到脚本。
内容的提问来源于stack exchange,提问作者Sha

