次の関数は、osとsysのインポート後にpython2を使用して呼び出すと正常に実行されますが、Nagios nrpeで呼び出すと誤動作します。
def get_proc1_open_files():
# Set proc1_children list to empty, then run a system command to get a list of proc1 child processes
proc1_children = []
for pids in os.popen("pgrep -P `ps -ef | grep 'proc1 master' | grep -v grep | head -1 | awk '{print $2}'`").readlines():
proc1_children.append(pids.strip())
# Build an lsof command using the proc1_children list as the list of pids. Grep out the data files lines
proc1_lsof = "lsof -p " + ','.join(map(str,proc1_children)) + " | grep -P .*\/[0-9]+\.yaml"
#Finally, run the lsof and return the number of open files
proc1_open_files = len(os.popen(proc1_lsof).readlines())
return proc1_open_files
関数全体に多くの印刷物を配置し、特定の関数のネストを解除して再度実行することで、Nagios nrpeが呼び出されたときに次の行まですべてがうまく機能すると判断しました。
proc1_open_files = len(os.popen(proc1_lsof).readlines())
特にos.popen(proc1_lsof).readlines()
何らかの理由で何も返されないことがわかりました。
メモ:
- 私はスクリプトをPython 2スクリプトとして定義したことを確認しました。
- Debian Wheezyで実行
- Nagios3はスクリプトの出力を正常に処理しました。結果の値は単に正しい値ではありません。
- スクリプトは通常5〜25の範囲の値を返します。
- ユーザーがそれを実行したときの出力は、通常「Warning - 12 proc1 open file」と同じです。
- Nagios nrpeで実行したときの正確な出力は「OK - 0 proc1 open files」です。毎回。
スクリプト全体へのリンクは次のとおりです。nrpeplugin.py
私はこのコードスニペットがユーザーが直接呼び出すときとNagios nrpeを介して呼び出すときに異なる動作をする理由を主に把握したいので、Stack OverflowではなくUNIX Stack Exchangeにこの記事を投稿しています。これが正しいフォーラムでない場合は謝罪します。
答え1
問題は、lsof
スクリプトがnagiosユーザーとして実行されることです。
次の行を/etc/sudoers(またはオプションで/etc/sudoers.d/の新しいファイル)に追加する必要があります。
nagios ALL=(root) NOPASSWD: /usr/bin/lsof
また、次のようにスクリプトの15行を変更する必要があります。
proc1_lsof = "sudo lsof -p " + ','.join(map(str,proc1_children)) + " | grep -P .*\/[0-9]+\.yaml"
このように変更したら、プラグインを実行する準備が整いました。