我想使用 Monit 监控 NFS 挂载和 NFS 服务器进程。
在服务器上,我需要一个 PID 文件,但我似乎找不到使用现有配置文件创建该文件的方法。有没有办法做到这一点,或者是否有人以不同的方式监控服务器(检查端口 53 是否处于活动状态等)。
在客户端上,我考虑让 Monit 简单地在 NFS 安装中查找特定文件,如果该文件可访问,则一切正常。问题是,如果 NFS 服务器确实出现故障,文件请求通常会挂起(甚至可能无限期挂起,不确定)。如何通过 monit 解决此问题?
任何配置示例都将不胜感激!
答案1
至于NFS服务器故障时Monit进程的“挂起”,可以通过两种方法来规避。
- 您将 NFS 挂载选项从 更改
hard
为soft
,这会导致 NFS 层在retrans
重试后向访问应用程序发出 I/O 错误。因为这可能会导致与数据完整性相关的其他问题(您的写作应用程序需要能够应对 I/O 错误,或者至少能够干净地退出,而不会损坏写入的文件),您还可以尝试: - 将您的检查与 Monit 异步化(将其解开)。您可以定义一个 cronjob 定期检查您的 NFS 挂载文件并写入另一个“NFS 状态文件”,例如写入 /tmp。这样,如果 NFS 服务器消失,则只有 cronjob 会挂起(而不是您的 Monit 客户端)。您的 Monit 检查现在只检查这个第二阶段的“NFS 状态文件”以及它是否比 cronjob 的频率要旧得多(这将表明 NFS 挂起)。
希望这可以帮助!
答案2
一般方法是(假设 Monit 内置规则均不适用)
- 了解如何进行检查手动
- 编写执行这些检查的 shell 脚本,返回 0 表示“成功”,返回 1 表示“失败”
让 Monit 测试这些脚本(示例来自官方文档):
check program myscript with path "/usr/local/bin/myscript.sh" if status != 0 then alert
对于具体问题,这可能意味着
服务器:这可能取决于您的操作系统、Linux 发行版、NFS 3 或 4 等,但应该很容易弄清楚。例如在 Ubuntu 12.04 上,我将通过以下方式测试 NFS 服务器是否正在运行
$ service portmap status $ service nfs-kernel-server status
如果两个命令都返回“运行”,则创建一个返回 0 的 shell 脚本。
客户端:要检查某个 NFS 共享当前是否已安装,我主要使用 df -h。因此相应的 shell 脚本如下所示
#! /bin/bash df -h | grep -q thesharename
答案3
我直接使用df
测试,没有使用特定的脚本:
check program nfs-var with path "/bin/df -t nfs4 /var"
if status != 0 then alert
if status = 1 then exec "/bin/mount /var"
答案4
我想回复克拉斯,但我没有足够的声誉点。使用外部脚本的想法非常好,因为它提供了灵活性,并且建议使用 portmap 或 rpcinfo 来检查 nfs 服务器可用性非常聪明。
我发现了一个Github 上由 Thibaut Madelaine 编写的脚本我认为这对许多面临同样问题的人来说应该很有趣。他像这样使用 rpcinfo,rpcinfo -u 123.456.789.12 nfs 3
其中 123.456.789.12 是您的 nfs 服务器的 ip 地址。
如果一切正常,响应将立即类似于program 100003 version 3 ready and waiting
如果失败123.456.789.12: RPC: Program not registered
。当然,我猜响应可能会因您的系统风格而异。