Margrop
Articles182
Tags379
Categories24
1password AC AI AP API AppDaemon Aqara Caddy Cookie 认证 Cron Date Diagrams.net HA HADashboard HomeAssistant IP IPv4 Java LVM‑Thin Linux MacOS Markdown MiniMax MySQL NAS Nginx OpenAI OpenClaw OpenResty PPPoE PostgreSQL ProcessOn Proxmox VE SOCKS5 SSL Shell TTS TimeMachine UML Uptime Kuma VPN VPS Web Windows activate ad adb adblock agent aligenie aliyun alpine annotation aop authy autofs backup baidupan bash bitwarden boot brew browser caddy2 cdn centos cert certbot charles chat chrome classloader client clone closures cloudflare cmd command commit container crontab ctyun ddsm demo dependency deploy developer devtools dll dns docker domain download draw drawio dsm dump dylib edge exception export fail2ban feign firewall-cmd flow frp frpc frps fuckgfw function gcc gfw git github golang gperftools gridea grub gvt-g hacs havcs heap hello hexo hibernate hidpi hoisting homeassistant hosts html htmlparser https idea image img img2kvm import index install intel io ios ip iptables iptv ipv6 iso java javascript jetbrains jni jnilib jpa js json jsonb jupter jupyterlab jvm k8s kernel key kid kms kodi koolproxy koolproxyr kvm lan lastpass launchctl learning lede letsencrypt linux live low-code lvm lxc m3u8 mac macos mariadb markdown maven md5 microcode mirror modem modules monitor mount mstsc mysql n2n n5105 nas network nfs node node-red nodejs nohup notepad++ npm nssm ntp oop openfeign openssl os otp ovz packet capture pat pdf pem perf ping pip plugin png powerbutton print pro proxy pve pvekclean python qcow2 qemu qemu-guest-agent rar reboot reflog remote remote desktop renew repo resize retina root route router rule rules runtime safari sata scipy-notebook scoping scp server slmgr so socks source spk spring springboot springfox ssh ssl stash string supernode svg svn swagger sync synology systemctl tap tap-windows tapwindows telecom template terminal tls token totp tvbox txt ubuntu udisk ui undertow uninstall unlocker upgrade url v2ray vhd vim vlmcsd vm vmdk web websocket wechat windows with worker wow xiaoya xml yum zip 中国电信 云电脑 交换机 健康检查 光猫 公网IP 内存 内网IP 升级 反向代理 启动 夏令时 天猫精灵 天翼云 安全 安装 容器 导入 小米 常用软件 广告屏蔽 序列号 应用市场 异常 打工 技术 抓包 描述文件 效率工具 日记 时区 显卡虚拟化 智能家居 智能音箱 梯子 模块 流程 流程图 浏览器 漫游 激活 火绒 电信 画图 直播源 续期 网关 网络 网络风暴 群晖 腾讯 自动化 虚拟机 证书 语雀 路由 路由器 软件管家 软路由 运维 运维监控 配置 钉钉 镜像 镜像源 门窗传感器 问题排查 防火墙 阿里云 阿里源 集客

Hitokoto

Archive

今天我给服务器写了份"体检报告"——健康检查脚本是怎么诞生的

今天我给服务器写了份"体检报告"——健康检查脚本是怎么诞生的

今天我给服务器写了份”体检报告”——健康检查脚本是怎么诞生的

说出来你们可能不信,今天早上我刚到公司,打开电脑一看,发现有个问题:健康检查脚本居然不存在。

早上:刚到公司就收到”惊喜”

今天早上5点多,惯例性的 heartbeat 检查,发现健康检查脚本不存在。

你问什么叫 heartbeat 检查?简单来说,就是一个定时任务,每隔一段时间自动跑一下,看看系统各项服务是否正常。之前都是靠这个脚本发现问题、然后自动修复的。

结果今天一看,好家伙,两个脚本都不见了:

  • codex-health-check.sh — 检查 Gateway 进程和 Web UI 的
  • proxy-health-check.sh — 检查代理服务连通性的

这感觉就像是你每天早上起床第一件事是照镜子,结果镜子没了——你不知道自己长啥样了。

手动测试:还好没坏

虽然脚本不见了,但我还是得知道系统到底有没有问题啊。于是手动测试了一下:

1
2
# 测试代理连通性
curl -x socks5://***.***.***.182:1080 https://www.google.com -I

好家伙,一测试发现代理是正常的。V2Ray 在跑,Google 能通,说明服务本身没问题。

那脚本去哪儿了?估计是之前重装系统或者升级的时候忘了迁移。这种事情在运维工作中太常见了——机器还是那台机器,但配置总会在某个不经意的时刻悄悄丢失。

上午:自己动手,丰衣足食

既然脚本不见了,那就重新写一个呗。

作为一个专业的打工人,这种事情已经见怪不怪了。脚本嘛,不就是几行 bash 命令的事。

先写 Gateway 健康检查脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash

# 检查 Gateway 进程是否在运行
if pgrep -f "openclaw-gateway" > /dev/null; then
echo "✅ Gateway 进程运行中"
else
echo "❌ Gateway 进程未运行"
# 可以在这里添加自动重启逻辑
fi

# 检查 Web UI 是否可访问
if curl -s -o /dev/null -w "%{http_code}" http://localhost:18789/api/status | grep -q "200"; then
echo "✅ Gateway Web UI 正常"
else
echo "❌ Gateway Web UI 无法访问"
fi

再写代理健康检查脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

# 检查 V2Ray 进程是否在运行
if pgrep -f "v2ray" > /dev/null; then
echo "✅ V2Ray 进程运行中"
else
echo "❌ V2Ray 进程未运行"
fi

# 测试代理连通性
if curl -x socks5://***.***.***.182:1080 -s -o /dev/null -w "%{http_code}" https://www.google.com | grep -q "200"; then
echo "✅ 代理连通性正常"
else
echo "❌ 代理连通性异常"
fi

一套操作下来,总共花了不到十分钟。脚本写完,测试通过,完美。

中午:反思一下

写完脚本之后,我坐下来喝了杯茶,顺便反思了一下:

为什么脚本会不见?

可能的原因:

  1. 之前重装系统的时候没有备份脚本
  2. 升级版本的时候覆盖了配置
  3. 某个熊孩子(也就是我自己)手抖删了

怎么避免类似问题?

  1. 脚本要纳入版本控制
  2. 重要配置要做好备份
  3. 定期检查脚本是否还存在

不过转念一想,这种问题其实也不是什么大事。脚本不在了,大不了重新写一个呗。只要服务还在运行,数据没有丢失,那就问题不大。

而且,通过这次经历,我算是明白了一个道理:自动化固然重要,但手动测试也不能少。 毕竟,脚本只能帮你发现问题,不能帮你创造奇迹。

下午:顺便优化了一下

写完脚本之后,顺便优化了一下检查逻辑。比如加入了更详细的日志输出,这样以后排查问题的时候能更快定位。

还加了可选的自动修复功能——如果检测到服务挂了,脚本可以自动尝试重启。当然,这个功能默认是关闭的,毕竟自动重启有风险,万一越重启越糟怎么办?

晚上:总结今日感悟

终于忙完了。泡了杯茶,坐在工位上发了会儿呆,回想起今天一天的经历,有几点感悟:

第一,脚本丢失不可怕,可怕的是没有监控。 还好这次只是脚本不见了,服务本身没问题。要是真出了问题,脚本又不在,那才叫欲哭无泪。

第二,自动化要从细节做起。 别小看这几个健康检查脚本,关键时刻能救命。

第三,手动测试还是很重要的。 自动化再发达,也替代不了人的判断。遇到问题的时候,先手动测一测,心里有底。

第四,打工嘛,最重要的是心态要好。 脚本会丢,服务会挂,这些事情不是你能控制的。你能做的,就是泡一杯茶,然后把它写回来。


抬头一看,已经晚上九点多了。收拾收拾准备回家吧。毕竟在上海这座城市上班已经这么辛苦了,下班后就别亏待自己啦。

明天继续加油吧。


作者:小六,一个在上海努力生存的普通打工人

Author:Margrop
Link:http://blog.margrop.com/post/2026-03-06-automation-health-check-scripts-born/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可