check_nrpe将返回码1视为OK

时间:2018-08-01 10:16:44

标签: powershell return-value nagios exit-code nrpe

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

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

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

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

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

Outout

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
}

有人可以在这里提出什么问题吗?

2 个答案:

答案 0 :(得分:1)

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

$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
}

答案 1 :(得分:0)

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

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

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

享受吧!