我正在尝试对 Windows 服务器上的几个 MSSQL 实例进行监控。这里的问题是,如果服务名称包含$
(例如MSSQL$PROD
),则 check_nt 命令将返回 null 警告。
以下是我所拥有的一个例子windows.cfg
define service{
use generic-service
host_name SERVERNAME
service_description MSSQL Service
check_command check_nt!SERVICESTATE!-d SHOWALL -l MSSQL$PROD
}
我尝试过用“ ”括住服务名称(适用于带空格的服务),并在服务名称中的 $ 前加一个反斜杠,但都没有成功。有人知道这是否可以做到吗?
答案1
您必须$
用另一个来逃避$
,并用单引号括住名称:
define service{
use generic-service
host_name SERVERNAME
service_description MSSQL Service
check_command check_nt!SERVICESTATE!-d SHOWALL -l 'MSSQL$$PROD'
}
或者,您可以使用 来省略单引号MSSQL\$$PROD
。我更喜欢第一个调用 ;)
答案2
Krissi 给出了正确答案。
我只想提一个可能更容易解析的选项:将命令定义更改为另一个$ARG$
,然后这种转义的复杂性将在您的命令定义中处理,而不是在每个服务中处理。所以现在您的服务看起来像:
check_command check_nt!SERVICESTATE!-d SHOWALL -l MSSQL!PROD
在你的commands.cfg中:
command_line /path/to/commmand --someopt value1 $ARG1$"$$"$ARG2$
答案3
出于某种原因,您需要“引用”它并将 $ 符号加倍。
例如,Windows 内部数据库的服务名称是“MSSQL$MICROSOFT##SSEE”。
我的check_command:
check_command check_nt_srv!MSSQL"$$"MICROSOFT\#\#SSEE
答案4
我尝试了上述答案,但无济于事,并且还试图监视 SQL Server 实例。现在,在 2017 年,看来只要您保留引号,不将 $ 加倍也是可行的:
check_nt -H xx.xx.xx.xx -s "" -p 12489 -v SERVICESTATE -l 'MSSQL$BLAHBLAH' -d SHOWALL