linux轮询监控用while :加sleep实现,需设恒真条件、合理延时(1–30秒依场景)和退出机制;支持文件时间戳比对、端口探测(nc)、进程存活检查(pgrep),轻量且免依赖。

Linux 中用无限循环加 sleep 实现轮询监控,关键在于构造恒真条件、加入合理延时、设置退出机制,并适配具体监控目标。它轻量、无需额外依赖,适合脚本化部署和临时诊断。
基础结构:用 while : 搭配 sleep
推荐使用 while :(冒号是 bash 内置空命令,始终返回成功状态),比 while true 更轻量:
while :; do echo "checking..."; sleep 2; done- 每次循环末尾必须有
sleep,否则会变成 CPU 密集型忙等待 -
sleep时间根据场景调整:监控端口可用性常用 1–3 秒;文件变化轮询建议 2–5 秒;系统资源检查可放宽至 10–30 秒
监控文件是否被修改
在无 inotify-tools 环境下,用时间戳比对实现简易轮询:
- 先获取初始修改时间:
last_mod=$(stat -c "%Y" /path/to/file 2>/dev/null) - 循环中重新读取并比较:
cur_mod=$(stat -c "%Y" /path/to/file 2>/dev/null) - 若不一致,说明文件已更新,可触发备份、重启服务等动作
- 加上
2>/dev/null避免文件暂不存在时报错干扰输出
等待远程服务端口就绪
常用于容器启动后等待数据库或 API 服务启动完成:
- 用
nc -z host port测试 TCP 连通性(不发数据,仅探测) - 写成否定形式:
while ! nc -z db.example.com 3306; do echo "waiting..."; sleep 2; done - 连接成功后自动退出循环,后续命令可立即执行
- 如需更严格验证(比如 MySQL 能真正执行 SQL),改用
mysql -h ... -e "SELECT 1"并配合超时控制
守护进程存活状态检查
定期确认关键服务是否仍在运行,必要时拉起:
- 用
pgrep -f "redis-server"检查进程是否存在,比ps | grep更可靠 - 示例逻辑:
if ! pgrep -f "myapp" > /dev/null; then systemctl start myapp; fi - 注意避免重复启动:加锁或检查 PID 文件可进一步增强健壮性
- 间隔建议设为 10–30 秒,太短增加系统负担,太长导致恢复延迟











