Debian
由 Nagios nrpe 啟動時,python 呼叫有何不同?
導入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"
進行這些更改後,該外掛將起作用。