Debian

由 Nagios nrpe 啟動時,python 呼叫有何不同?

  • September 29, 2015

導入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 files”。
  • 通過 Nagios nrpe 執行時的確切輸出是“OK - 0 proc1 open files”。每次。

這是完整腳本的連結:nrpeplugin.py

我將其發佈在 UNIX 堆棧交換而不是 Stack Overflow 中,因為我主要是想找出為什麼程式碼在通過 Nagios nrpe 呼叫時與使用者直接呼叫時的行為不同。如果這不是正確的論壇,我深表歉意。

問題是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"

進行這些更改後,該外掛將起作用。

引用自:https://unix.stackexchange.com/questions/232676