可用 crontab + nc 实现纯 shell 主机在线探测与基础告警:定时用 nc -z 测试目标端口连通性,成功写日志,失败发邮件;需确保 nc 支持 -z 参数,脚本设超时并赋予执行权限,crontab 配置每2分钟执行一次。

用 crontab + nc 实现主机在线探测和基础告警,无需额外服务、不依赖 Python/Go 等运行时,纯 Shell 可完成。核心思路是:定时对目标主机的某个开放端口(如 SSH 的 22、HTTP 的 80)发起 TCP 连接尝试,成功即视为“在线”,失败则触发轻量通知(如写日志、发邮件、写文件标记)。
一、确认 nc 支持 -z 参数(静默扫描模式)
nc(netcat)必须支持 -z(zero-I/O mode),用于纯端口连通性测试,不传输数据,速度快、无副作用。验证方式:
$ nc -z 127.0.0.1 22 && echo "ok" || echo "fail"
若提示 invalid option -- 'z',请安装 GNU 版 netcat(如 Debian/Ubuntu 上 apt install netcat,而非 netcat-traditional;macOS 可用 brew install nmap 后用 ncat -z,或直接用 timeout 3 bash -c 'echo > /dev/tcp/127.0.0.1/22' 2>/dev/null 替代)。
二、编写单行探测脚本(推荐存为 /usr/local/bin/host-ping.sh)
以下脚本检测 192.168.1.100 的 22 端口,超时 3 秒,成功写 OK 时间戳,失败发邮件并记录:
#!/bin/bash
HOST="192.168.1.100"
PORT="22"
LOG="/var/log/host-check.log"
if timeout 3 nc -z "$HOST" "$PORT" >/dev/null 2>&1; then
echo "$(date '+%F %T') $HOST:$PORT UP" >> "$LOG"
else
echo "$(date '+%F %T') $HOST:$PORT DOWN" >> "$LOG"
echo "ALERT: $HOST:$PORT offline at $(date)" | mail -s "HOST DOWN" admin@example.com
fi
赋予执行权限:chmod +x /usr/local/bin/host-ping.sh
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
三、配置 crontab 实现每 2 分钟轮询一次
编辑 root 的定时任务(因发邮件通常需系统级 mail 工具):
$ sudo crontab -e
添加一行:
*/2 * * * * /usr/local/bin/host-ping.sh
说明:该规则每两分钟执行一次。如需更精细控制(例如避开备份窗口),可改用 */2,10-55/5 等表达式;若仅需每日检查,用 0 9 * * * 即可。
四、增强可用性的小技巧
-
多主机批量探测:将 HOST 和 PORT 放入循环,或从文件读取(
while IFS= read -r line; do HOST=${line%%:*}; PORT=${line##*:}; ... done ) -
避免误报:连续失败 3 次再告警。可用临时文件记录失败次数,或借助
logger+journalctl查询最近状态 -
无邮件环境替代方案:写触发文件(
touch /tmp/HOST_DOWN_$(date +%s))、调用 webhook(用curl -X POST推送至钉钉/企业微信机器人)、或更新一个 HTML 状态页 - 资源友好:nc 连接极快,单次耗时通常 timeout 防卡死;避免高频率(
这套组合不依赖数据库、Web 框架或中心化监控平台,适合边缘设备、CI 测试机、家庭 NAS 等场景做最低成本心跳观测。真正做到了“一宿脚本、两行 cron、三秒见效”。










