我已经定义了这个命令:
define command{
command_name check_http_sane
command_line $USER1$/check_http -H $HOSTNAME$ -r "HTTP/1.1 (200|301|302|303|304|307|401|418|426)"
}
当我在命令行上手动运行它时,它工作正常,但 nagios (2.6) 报告“未找到模式”错误。我需要转义某些内容吗?
编辑:如下所示,我通过check_http
用我自己的脚本替换解决了这个问题(无论如何,对于我们的用例来说已经足够好了)。脚本:http://pastebin.com/hNmz6Wa1
答案1
check_http.c 的源代码显示该-r
选项检查标题和页面内容。您看到的问题可能是 Nagios 命令宏解释器试图替换正则表达式字符串中的某些内容。
您应该尝试转义所有(
、|
和)
字符。如果这不起作用,请尝试仅使用括号和竖线。您也可以尝试使用单引号而不是双引号。
答案2
因为逃跑也不管用(而且做由于我不需要命令行就可以工作,而且我也不想花更多时间调试它,所以我编写了自己的 Nagios 插件来替换 check_http,它非常有效:
答案3
您关于此命令在命令行上“运行良好”的断言值得怀疑。当我手动运行它时,它并没有“运行良好”:
./check_http -H localhost -r "HTTP/1.1 (200|301|302|303|304|307|401|418|426)" HTTP CRITICAL: HTTP/1.1 302 Found - pattern not found - 650 bytes in 0.001 second response time |time=0.001410s;;;0.000000 size=650B;;;0
正如 Jeff Strunk 所建议的,您需要转义括号(以便 shell 不会使用它们),如下所示:
./check_http -H localhost -r "HTTP/1.1 \(200|301|302|303|304|307|401|418|426\)" HTTP OK: HTTP/1.1 302 Found - 650 bytes in 0.001 second response time |time=0.001425s;;;0.000000 size=650B;;;0