我为 Windows 服务器编写了一个批处理文件,用于检测某个服务是否正在运行,如果未运行,则向 Nagios 返回“严重”状态。该脚本运行良好(因为它可以判断进程是否正在运行,我已尝试使用正在运行的服务和未运行的服务),并返回正确的字符串,但无论它返回哪个字符串,Nagios 中的状态始终正常。
以下是代码(显然,各种变量名称都被掩盖了):
@Echo Off
Set ServiceName=ServiceNameGoesHere
SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(
echo CRITICAL: Service not running!
exit /b 2
)||(
echo OK: Service active.
exit /b 0
)
以下是 Nagios 中的匹配部分:
define service {
host_name myWindowsServer
use local-service
service_description Service Active Check
check_command check_ncpa!-P 5693 -M 'plugins/service_check.bat'
notification_options w,c
contacts nagiosadmin
register 1
}
奇怪的是,如果我在主机服务器的命令行上手动运行 BAT 文件,然后运行echo %errorlevel%
它,它会返回正确的状态代码(2 或 0)。Nagios 似乎只看到 0 状态,因为它一直为两者返回 OK,尽管获得了正确的字符串。
我的服务器绝大多数都是 Linux,所以我以前只使用 shell 脚本编写过脚本,并且这些脚本可以正确返回状态。我做错了什么?
答案1
我重新调整了 if 语句逻辑并且让它正常工作:
@Echo Off
Set ServiceName=ServiceNameGoesHere
SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">NUL
if %errorlevel% == 0 (echo CRITICAL: Service not running! & exit /b 2)
if %errorlevel% == 1 (echo OK: Service active. & exit /b 0)
当指定的服务未运行时,将返回 2;当指定的服务正在运行时,将返回 0,并返回正确的字符串。