You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:20:28