如何修改Bash脚本以显示具体宕机的服务器IP?
修改Bash脚本以显示具体宕机的服务器IP
我来帮你搞定这个问题!原脚本的逻辑是只有当所有主机都ping失败时才触发警告,但没有记录具体是哪台机器出了问题。我们可以调整脚本,跟踪每台主机的ping结果,收集所有宕机的IP,最后在弹窗里展示出来。
修改后的完整脚本
#!/bin/bash HOSTS="192.168.11.154 192.168.11.155" COUNT=5 # 初始化存储失败主机的变量 FAILED_HOSTS="" pingtest(){ for myHost in "$@" do # 单独测试每台主机,ping失败则加入失败列表(屏蔽ping的输出) if ! ping -c "$COUNT" "$myHost" > /dev/null 2>&1; then FAILED_HOSTS+="$myHost\n" fi done # 如果失败列表非空,返回0(表示需要触发警告) [ -n "$FAILED_HOSTS" ] && return 0 || return 1 } if pingtest $HOSTS then # 将失败的IP列表插入到警告文本中 zenity --warning --text="<span size=\"xx-large\">WARNING</span>\n\n\n以下服务器已宕机:\n<b>$FAILED_HOSTS</b>" --title="SERVER DOWN" --ok-label="OKAY" fi
关键修改点说明
- 新增
FAILED_HOSTS变量:专门用来存储所有ping失败的服务器IP,初始化为空字符串。 - 逐台主机判断ping结果:不再用
&& return 1提前退出循环,而是对每台主机单独检测——如果ping失败,就把该IP追加到失败列表里,用换行符\n分隔,保证弹窗里的IP分行显示更清晰。 - 调整函数返回逻辑:遍历完所有主机后,检查失败列表是否非空——只要有宕机的主机,就返回0触发警告;否则返回1跳过警告。
- 更新弹窗文本内容:把原来的占位符
*IP*替换为实际的失败IP列表,同时调整文本格式,让警告信息更直观。
额外优化建议
- 可以给ping命令加上超时参数(比如
-W 2表示超时2秒),避免脚本长时间卡在ping命令上:ping -c "$COUNT" -W 2 "$myHost" - 如果希望弹窗里的IP排版更整齐,可在IP前加
\t缩进,或者调整zenity的文本样式标签。
内容的提问来源于stack exchange,提问作者Alexandr Bortnik
相关产品推荐
相关产品推荐

