当我们在 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_procs
,ps
则要么生成错误格式的输出(见证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