redhat7 운영 체제에서 Nagios check_procs 모듈을 실행하면 다음 오류가 발생합니다. Google에서 검색해 보니 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
.
프로세스를 검사하기 위한 명령을 check_procs
생성하는 Nagios 플러그인은 명령 출력에 -style 형식 문자열을 적용하여 실행 중인 프로세스에 대해 알아야 할 사항을 찾습니다. 운영 체제마다 명령이 크게 다르기 때문에 각 운영 체제의 명령에 맞게 조정 해야 합니다 .ps
scanf()
ps
ps
check_procs
이는 플러그인이 소스 코드에서 바이너리로 컴파일될 때 수행됩니다. 알려진 모든 ps
매개변수+옵션 조합을 차례로 확인하고 그 중 하나가 유효할 때까지 형식 문자열을 검색하는 400줄 이상의 구성 스크립트가 있습니다 . 그런 다음 이 조합은 컴파일된 플러그인에 내장됩니다.
실행 중인 실제 시스템에 대한 조합이 잘못된 경우 check_procs
잘못된 ps
형식의 출력이 생성됩니다(증인MacPorts 버그 #28801그리고모니터링 플러그인 문제 #1328) 또는 표준 오류에 대한 오류 메시지를 생성합니다(증인데비안 버그 #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