システムコールは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パラメータとオプションの組み合わせを順番にチェックし、そのうちの1つが有効になるまでフォーマット文字列を検索する400行以上の設定スクリプトがあります。その後、この組み合わせはコンパイルされたプラグインに組み込まれます。

実行中の物理システムの組み合わせが間違っていると、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

関連情報