시스템 호출은 stderr에 경고를 보냅니다: 오류: 지원되지 않는 옵션(BSD 구문)

시스템 호출은 stderr에 경고를 보냅니다: 오류: 지원되지 않는 옵션(BSD 구문)

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 형식 문자열을 적용하여 실행 중인 프로세스에 대해 알아야 할 사항을 찾습니다. 운영 체제마다 명령이 크게 다르기 때문에 각 운영 체제의 명령에 맞게 조정 해야 합니다 .psscanf()psps

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

관련 정보