check_nrpe 将返回码 1 视为 OK

Posted

技术标签:

【中文标题】check_nrpe 将返回码 1 视为 OK【英文标题】:check_nrpe treats return code 1 as OK 【发布时间】:2018-08-01 10:16:43 【问题描述】:

我有一个通过 check_nrpe 调用的 powershell 脚本。当我进行被动检查时,我看到退出代码/返回值为 1,但它仍被视为状态 OK 而不是 CRITICAL。

基本上这个脚本只是检查目标文件夹 ..\bar 是否为空。如果它为空,则脚本返回“0”,触发 Nagios 中的 OK 状态。如果它的文件在等待 25 秒后仍不移动,则返回“1”,这会在 Nagios 中触发 CRITICAL 状态。

我在文件夹中保留了几个文件,可以看到返回值为 '1'。但是 nagios 仍然将其视为状态 OK

使用以下命令进行被动检查。

$ /usr/lib64/nagios/plugins/check_nrpe -H 10.XX.X.XXX -c check_kpis -t 30

输出

1

脚本如下。

$path = "D:\foo\bar"
$flagged1 = "D:\temp\flag1.txt"
$flagged2 = "D:\temp\flag2.txt"

$contents = Get-ChildItem -Path $path -Force -Recurse
if ( $contents.count -gt 0 )

    $contents.Name | Out-File -FilePath $flagged1
    Start-Sleep -s 25
    $contents = Get-ChildItem -Path $path -Force -Recurse
    $contents.Name | Out-File -FilePath $flagged2
    if ( $contents.count -gt 0  )
    
        $diff = Compare-Object -ReferenceObject $(Get-Content $flagged1) -DifferenceObject $(Get-Content $flagged2) -IncludeEqual 
        If ($diff.SideIndicator -eq "==")
        
            return 1
            exit
        
        else
        
            return 0
            exit
        
    
    else
    
        return 0
        exit
    

else

    return 0
    exit

谁能建议这里有什么问题?

【问题讨论】:

【参考方案1】:

决定状态的是 EXIT 代码,您使用的 return 甚至不在函数中。这样的东西会更好

$path = "D:\foo\bar"
$flagged1 = "D:\temp\flag1.txt"
$flagged2 = "D:\temp\flag2.txt"

$contents = Get-ChildItem -Path $path -Force -Recurse
if ( $contents.count -gt 0 )

    $contents.Name | Out-File -FilePath $flagged1
    Start-Sleep -s 25
    $contents = Get-ChildItem -Path $path -Force -Recurse
    $contents.Name | Out-File -FilePath $flagged2
    if ( $contents.count -gt 0  )
    
        $diff = Compare-Object -ReferenceObject $(Get-Content $flagged1) -DifferenceObject $(Get-Content $flagged2) -IncludeEqual 
        If ($diff.SideIndicator -eq "==")
        
            echo 1
            exit 1
        
        else
        
            echo 0
            exit 0
        
    
    else
    
        echo 0
        exit 0
    

else

    echo 0
    exit 0

【讨论】:

【参考方案2】:

当你在 Nsclint.ini 文件中定义你的 powershell 命令时,你必须像这样定义你的脚本:

check_esomething=cmd /c echo scripts\check_something.ps1; exit($lastexitcode) | powershell.exe -command - 

因此您必须在定义中添加“exit($lastexitcode)”语句。

享受吧!

【讨论】:

以上是关于check_nrpe 将返回码 1 视为 OK的主要内容,如果未能解决你的问题,请参考以下文章

G-WAN - 如果请求 URL = 541+ 个字符,如何返回状态码:200 OK?

Swagger 全局定义返回状态码和单独定义返回状态码

Spring MVC 返回自定义 HTTP 状态码(无错误)

服务器返回的14种常见HTTP状态码

shell脚本:监控HTTP服务的状态(测试返回码)

check_nrpe: ERROR - could not complete SSL handshake