Ksh脚本问题:服务器重启状态检测脚本日期判断失效求助
解决Ksh脚本中服务器重启状态判断的日期逻辑问题
问题根源分析
你遇到的日期判断失效,大概率是以下原因导致:
ps命令输出的日期格式存在差异:当系统运行超24小时且日期为个位数时,部分ps版本会输出带空格的格式(如Nov 3),仅提取第5列只能得到月份缩写(Nov),无法匹配预设的日期格式。- 正则表达式不严谨:未考虑月份缩写大小写、日期格式的空格差异,或是未启用扩展正则支持。
- 依赖
ps列位置:不同系统的ps输出列顺序可能存在变动,导致提取的内容并非预期的启动时间标识。
修复方案
方案1:修正ps列提取与匹配逻辑
如果坚持用ps列判断,需确保提取正确的启动时间标识,并调整匹配规则:
# 提取PID为1的系统初始化进程的启动时间标识(STIME列) # 处理ps输出中日期带空格的情况:若第5列是月份缩写,拼接第6列 STIME=$(ps -ef | awk '$2 == 1 {if ($5 ~ /^[A-Za-z]{3}$/) print $5$6; else print $5}') # 用case语句匹配格式,避免依赖外部grep命令 case "$STIME" in [0-9][0-9]:[0-9][0-9]) echo "服务器已重启,当前处于运行状态" ;; [A-Za-z][A-Za-z][A-Za-z][0-9]|[A-Za-z][A-Za-z][A-Za-z][0-9][0-9]) echo "服务器未重启,发送告警邮件" # 替换为你的邮件发送命令 echo "服务器未重启,启动时间标识为: $STIME" | mail -s "服务器重启状态告警" admin@yourdomain.com ;; *) echo "无法识别启动时间格式: $STIME" ;; esac
方案2:用更可靠的命令获取启动时间(推荐)
放弃依赖ps列位置,改用who -b直接获取系统启动日期,逻辑更稳定:
# 获取系统启动日期(格式:YYYY-MM-DD) BOOT_DATE=$(who -b | awk '{print $3}') # 获取当前日期(格式:YYYY-MM-DD) CURRENT_DATE=$(date +%Y-%m-%d) if [ "$BOOT_DATE" = "$CURRENT_DATE" ]; then echo "服务器已重启,当前处于运行状态" else echo "服务器未重启,发送告警邮件" echo "服务器启动日期: $BOOT_DATE,当前日期: $CURRENT_DATE" | mail -s "服务器重启状态告警" admin@yourdomain.com fi
关键注意事项
- 测试
ps/who -b的输出格式:不同操作系统(如Linux/AIX)的命令输出可能有细微差异,需根据实际环境调整提取逻辑。 - 邮件命令适配:确保系统中
mail命令可用,或替换为sendmail等符合环境的邮件工具。
内容的提问来源于stack exchange,提问作者Aditya Singh
相关产品推荐
相关产品推荐

