0

我有一个通过 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
}

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

4

2 回答 2

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
}
于 2018-08-03T18:23:40.930 回答
0

当您在 Nsclint.ini 文件中定义您的 powershell 命令时,您必须定义您的脚本,如:

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

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

享受!

于 2021-06-17T12:24:23.027 回答