Nagios作为一款广泛使用的开源监控系统,其核心功能依赖于灵活强大的监控命令,这些命令定义了Nagios如何与被监控对象交互,执行检查任务,并将结果反馈给监控系统,理解并熟练配置监控命令是充分利用Nagios进行有效系统监控的关键,Nagios的监控命令主要通过命令定义(command definition)来实现,这些定义通常存储在命令配置文件(如/etc/nagios/objects/commands.cfg
)中,也可以根据需要分散到其他自定义配置文件中,每个命令定义包含一个唯一的命令名称、命令行参数以及执行该命令所需的程序路径,命令行参数中可以使用宏(macros)来动态传递信息,例如$HOSTADDRESS$
代表被监控主机的主机地址,$SERVICEDESC$
代表服务描述,$ARG1$
到$ARG9$
代表用户自定义参数等。

Nagios监控命令的类型多种多样,可以根据监控目标的不同大致分为主机监控命令和服务监控命令,主机监控命令通常用于检查主机的可达性、系统负载、磁盘空间、内存使用情况等整体状态,最常用的check_ping
命令就是通过发送ICMP回显请求来检测主机的网络连通性和延迟,服务监控命令则更加具体,针对特定的服务或应用程序,如Web服务(HTTP/HTTPS)、邮件服务(SMTP)、数据库服务(MySQL、PostgreSQL)等,还可以根据执行方式分为本地执行命令和远程执行命令,本地执行命令通常通过NRPE(Nagios Remote Plugin Executor)、NSClient++或SNMP等方式在被监控主机上运行,而远程执行命令则直接在Nagios服务器上通过SSH或其它协议执行。
配置监控命令的第一步是定义命令本身,以一个简单的磁盘空间监控命令为例,我们可能需要使用check_disk
插件,该插件通常随Nagios Plugins一起安装,在commands.cfg
中,可以这样定义:
command_name check_local_disk command_line $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$ }
这里,command_name
是命令的唯一标识符,command_line
是实际执行的命令字符串。$USER1$
是一个宏,通常指向Nagios Plugins的安装目录(如/usr/local/nagios/libexec
),$ARG1$
、$ARG2$
、$ARG3$
是用户在使用该命令时需要提供的参数,分别对应警告阈值(-w)、临界阈值(-c)和要检查的挂载点或设备(-p),定义好命令后,需要在主机或服务定义中引用此命令,定义一个监控根分区磁盘空间的服务:
use generic-service host_name linux-server-01 service_description Root Partition Disk Space check_command check_local_disk!20%!10%!/ }
在这个服务定义中,check_command
指定了使用的命令名称check_local_disk
,并通过分隔符传递了三个参数:警告阈值为20%,临界阈值为10%,检查路径为根分区,当Nagios执行此服务检查时,会自动将20
、10
、分别替换为命令定义中的$ARG1$
、$ARG2$
、$ARG3$
,形成最终的执行命令:/usr/local/nagios/libexec/check_disk -w 20 -c 10 -p /
。

对于远程主机监控,NRPE是常用的方式,首先需要在被监控主机上安装NRPE daemon和Nagios Plugins,并配置NRPE允许来自Nagios服务器的连接,然后在Nagios服务器上定义NRPE命令,监控远程主机的CPU负载:
command_name check_nrpe command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$ }
这里的$ARG1$
是NRPE配置文件中定义的远程命令名称(如check_cpu_load
),$ARG2$
是传递给远程命令的参数,对应的服务定义可能如下:
use generic-service host_name remote-linux-server service_description CPU Load check_command check_nrpe!check_cpu_load!90,95,98 }
这意味着Nagios服务器会通过NRPE协议连接到remote-linux-server
的5666端口,执行名为check_cpu_load
的远程命令,并传递90,95,98
作为参数,这可能对应1分钟、5分钟、15分钟负载的平均值警告和临界阈值。
除了使用标准插件,用户还可以根据实际需求编写自定义脚本作为监控命令,监控特定应用程序的健康状态或自定义业务指标,自定义脚本可以是Shell脚本、Python脚本等,只要脚本能够返回标准的Nagios状态码(0=OK, 1=WARNING, 2=CRITICAL, 3=UNKNOWN)并在标准输出中输出状态信息即可,假设有一个自定义脚本check_app_status.sh
,用于检查某个应用进程是否运行:
#!/bin/bash process_name="my_app" pgrep -x "$process_name" > /dev/null if [ $? -eq 0 ]; then echo "OK: $process_name is running." exit 0 else echo "CRITICAL: $process_name is not running." exit 2 fi
将此脚本放在Nagios Plugins目录下,并赋予执行权限后,就可以在Nagios命令定义中引用它:
command_name check_my_app command_line $USER1$/check_app_status.sh }
然后在服务定义中使用check_my_app
命令即可。
为了更高效地管理大量监控对象,Nagios支持命令参数的模板化和嵌套,可以定义一个通用的TCP端口检查命令,然后为不同的服务端口复用该命令,Nagios还支持事件处理命令,当监控状态发生变化时自动触发执行,例如发送告警邮件或短信,事件处理命令的定义方式与普通监控命令类似,但在主机或服务定义的event_handler
和event_handler_enabled
选项中配置。
以下是一个常用的监控命令类型及其功能的简要总结表格:
命令类型 | 常用命令示例 | 功能描述 | 主要参数 |
---|---|---|---|
主机可达性 | check_ping | 检查主机网络连通性、延迟和丢包率 | -w (警告延迟), -c (临界延迟), -p (包数) |
主机资源 | check_load | 检查主机CPU负载 | -w (警告负载), -c (临界负载) |
check_disk | 检查磁盘空间使用率 | -w (警告%), -c (临界%), -p (路径/设备) | |
check_mem | 检查内存使用率 | -w (警告%), -c (临界%) | |
服务监控 | check_http | 检查Web服务可达性、响应时间、证书有效期等 | -I (地址), -p (端口), -u (URL), -S (SSL), --regex (内容匹配) |
check_smtp | 检查SMTP服务 | -H (地址), -p (端口) | |
check_ssh | 检查SSH服务可达性 | -H (地址), -p (端口) | |
数据库监控 | check_mysql | 检查MySQL服务状态、连接数、查询性能等 | -H (地址), -u (用户), -p (密码), -d (数据库) |
check_tcp | 通用TCP端口检查 | -H (地址), -p (端口), -s (发送字符串), -e (期望字符串) | |
NRPE远程命令 | check_nrpe | 通过NRPE执行远程主机上的插件命令 | -H (地址), -c (远程命令名), -a (参数) |
自定义脚本 | check_custom_app | 执行用户自定义脚本进行特定业务监控 | 脚本本身参数通过$ARG$传递 |
在实际部署中,合理规划和组织监控命令至关重要,应尽量复用现有命令,避免重复定义;对于复杂的监控逻辑,优先考虑编写可重用的脚本;为命令和服务描述使用清晰、一致的命名规范,以便于后期维护和故障排查,Nagios的强大之处在于其高度的灵活性和可扩展性,通过精心配置监控命令,可以构建一个全面、高效的企业级监控系统,及时发现并解决系统中的潜在问题,保障业务的稳定运行。
相关问答FAQs
问题1:Nagios监控命令中常用的宏有哪些?它们的作用是什么?
解答: Nagios监控命令中使用了大量的宏来动态传递信息,使得命令定义更加灵活和通用,常用的宏包括:
$HOSTADDRESS$
:被监控主机的IP地址或主机名。$HOSTNAME$
:被监控主机的主机名。$SERVICEDESC$
:被监控服务的描述名称。$SERVICESTATE$
:当前服务的状态(OK, WARNING, CRITICAL, UNKNOWN)。$HOSTSTATE$
:当前主机的状态。$ARG1$
到$ARG9$
:用户在定义服务或主机时传递的自定义参数,用于向命令传递特定值,如阈值、路径、端口等。$USER1$
到$USER32$
:用户自定义宏,通常用于指向插件目录、脚本路径或配置文件路径,例如$USER1$
默认指向Nagios Plugins的安装路径。$NOTIFICATIONTYPE$
:通知类型(如RECOVERY, PROBLEM, ACKNOWLEDGEMENT等),常用于事件处理命令。
问题2:如何解决Nagios执行监控命令时提示“command not found”或权限不足的问题?
解答: 遇到“command not found”通常表示Nagios无法找到指定的执行程序或脚本,解决方法包括:
- 检查命令路径:确保
command_line
中指定的程序或脚本路径正确,特别是$USER1$
等宏指向的目录是否存在,且包含所需的插件。 - 检查文件权限:确保Nagios运行用户(通常是
nagios
)对指定的程序或脚本有执行权限(x权限),以及读取脚本内部依赖文件所需的权限,可以使用chmod +x
赋予执行权限。 - 检查NRPE(如果是远程命令):对于通过NRPE执行的远程命令,确保被监控主机上NRPE daemon已安装并运行,且NRPE配置文件中定义了相应的命令,同时Nagios服务器IP在NRPE的
allowed_hosts
列表中。 - 检查日志:查看Nagios的日志文件(通常在
/var/log/nagios/nagios.log
),日志中会提供更详细的错误信息,有助于定位问题根源。
对于权限不足的问题,除了上述检查文件权限外,还需确保脚本中调用的其他命令或访问的文件路径对Nagios用户是可读可执行的,如果脚本需要特殊权限,可以考虑使用sudo
并配置/etc/sudoers
文件,允许Nagios用户以特定权限执行该脚本,但需注意安全性。