导入 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范围内的值
- 用户运行时的输出通常类似于“警告 - 12 proc1 打开文件”。
- 通过 Nagios nrpe 运行时的确切输出是“OK - 0 proc1 open files”。每次。
这是完整脚本的链接:nrpeplugin.py
我将其发布在 UNIX 堆栈交换中而不是 Stack Overflow 中,因为我主要是想找出为什么该代码片段在通过 Nagios nrpe 调用时与由用户直接调用时会有不同的行为。如果这不是正确的论坛,我深表歉意。
答案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"
进行这些更改后,该插件即可运行。