系统调用向 stderr 发送警告:错误:不支持的选项(BSD 语法)

系统调用向 stderr 发送警告:错误:不支持的选项(BSD 语法)

当我们在 redhat7 操作系统中运行 Nagios check_procs 模块时,我们遇到以下错误。通过谷歌搜索我们发现我们需要重新安装 procps 包。我们还重新安装了 procps 包,但该模块在第一次尝试时工作正常,然后失败了。

Error: System call sent warnings to stderr: error: unsupported option (BSD syntax)

答案1

Error: System call sent warnings to stderr: error: unsupported option (BSD syntax)

check_procs问题是插件和操作系统的命令不匹配ps

Nagios 的check_procs插件生成ps命令来检查进程,将scanf()-style 格式字符串应用于命令的输出,以找出它需要了解的有关正在运行的进程的信息。鉴于不同操作系统的命令存在很大差异ps,它必须根据每个操作系统的ps命令进行调整。

check_procs当插件从源代码编译为二进制文件时,就会执行此操作。有一个 400 多行的配置脚本,它会费力地依次检查每个已知的ps参数+选项组合并扫描格式字符串,直到其中一个有效。然后将该组合硬连线到编译的插件中。

如果该组合对于运行的实际系统来说是错误的check_procsps则要么生成错误格式的输出(见证MacPorts 错误 #28801监控插件问题 #1328)或生成错误消息到标准错误(见证Debian 错误 #296003)由插件拾取并发出警报。后者就是这里发生的情况。

这会产生多种后果:

  • 如果您从源代码构建插件,则需要使用ps与最终生产计算机上安装的命令相同的命令来构建它。
  • 如果您使用预构建的二进制文件,则该二进制文件需要构建在一个系统上,该系统的ps命令与运行插件的计算机上的命令相匹配。如果您没有自己构建二进制文件,则需要与构建者交谈,或者如果您使用的是打包的预构建二进制文件,则至少需要与软件包维护者交谈。

答案2

我们编写了一个用于总检查过程的脚本,它解决了错误:系统调用向 stderr 发送警告:错误:不支持的选项(BSD 语法)问题。

请找到下面的脚本。

 #!/bin/bash
#
# Script to check Process usage on Linux. Ignores Process used by disk cache.
#
# Requires the bc command
#                $1 $2 $3 $4
# ./check_Process -w 85 -c 95
print_help() {
    echo "Usage:"
    echo "[-w] Warning level as a percentage"
    echo "[-c] Critical level as a percentage"
    exit 0
}

while test -n "$1"; do
    case "$1" in
        --help|-h)
            print_help
            exit 0
            ;;
        -w)
            warn_level=$2
            shift
            ;;
        -c)
            critical_level=$2
            shift
            ;;
        *)
            echo "Unknown Argument: $1"
            print_help
            exit 3
            ;;
    esac
    shift
done

if [ "$warn_level" == "" ]; then
    echo "No Warning Level Specified"
    print_help
    exit 3;
fi

if [ "$critical_level" == "" ]; then
    echo "No Critical Level Specified"
    print_help
    exit 3;
fi

count=`ps -ef | wc -l`

###################

if [ "$count" -lt "$warn_level" ]; then
    echo "Process OK:$count | 'Process' =$count;$warn_level;$critical_level"
    exit 0;
elif [ "$count" -ge "$warn_level" ] && [ "$count" -le "$critical_level" ]; then
    echo "Process WARNING: $count | 'Process'=$count;$warn_level;$critical_level"
    exit 1;
elif [ "$count" -gt "$critical_level" ]; then
    echo "Process CRITICAL: $count | 'Process'=$count;$warn_level;$critical_level"
    exit 2;
fi

相关内容