我的任务是制作一个自定义python脚本(因为我对Bash不太满意),使其可以在远程NRPE客户端上运行,该客户端递归计算/ tmp目录中的文件数。这是我的脚本:
#!/usr/bin/python3.5
import os
import subprocess
import sys
file_count = sum([len(files) for r, d, files in os.walk("/tmp")]) #Recursive check of /tmp
if file_count < 1000:
x = subprocess.Popen(['echo', 'OK -', str(file_count), 'files in /tmp.'], stdout=subproce$
print(x.communicate()[0].decode("utf-8")) #Converts from byteobj to str
# subprocess.run('exit 0', shell=True, check=True) #Service OK - exit 0
sys.exit(0)
elif 1000 <= file_count < 1500:
x = subprocess.Popen(['echo', 'WARNING -', str(file_count), 'files in /tmp.'], stdout=sub$
print(x.communicate()[0].decode("utf-8")) #Converts from byteobj to str
sys.exit(1)
else:
x = subprocess.Popen(['echo', 'CRITICAL -', str(file_count), 'files in /tmp.'], stdout=su$
print(x.communicate()[0].decode("utf-8")) #Converts from byteobj to str
sys.exit(2)
编辑1:我尝试将file_count硬编码为1300,并且得到警告-/ tmp中有1300个文件。看来问题仅在于nagios服务器读取客户端计算机/ tmp中文件的能力。
我做了什么:
我在其他目录中都有该脚本。 我已经在客户端计算机上使用以下行编辑了/usr/local/nagios/etc/nrpe.cfg:
command [check_tmp] = / usr / local / nagios / libexec / check_tmp.py
我已经在nagios服务器/usr/local/nagios/etc/servers/testserver.cfg上编辑了该文件,如下所示:
define service {
use generic-service
host_name wp-proxy
service_description Files in /tmp
check_command check_nrpe!check_tmp
}
输出: 正确的输出是:OK-/ tmp中有3个文件
当我以root用户身份在客户端计算机上运行脚本时,我得到了正确的输出
当我以nagios用户身份在客户端计算机上运行脚本时,会得到正确的输出
我在Nagios核心上的输出似乎正在工作,但是当我知道还有更多文件时,它显示/ tmp中有0个文件。我在客户端计算机上制作了2个文件,在nagios服务器上制作了1个文件。
服务器输出以供参考:
https://puu.sh/BioHW/838ba84c3e.png
(忽略底层服务器,使用wp-proxy解决的任何问题也将在wpreess-gkanc1上更改)
编辑2:我在nagios服务器上运行了以下命令: / usr / local / nagios / libexec / check_nrpe -H 192.168.1.59 -c check_tmp_folder
我确实返回了0文件。我仍然不知道如何解决这个问题。
预先感谢
答案 0 :(得分:0)
系统服务文件,也许此var设置为true:)
PrivateTmp=
接受布尔参数。如果为true,则为执行的进程设置一个新的文件系统名称空间,并在其中安装私有的/tmp
和/var/tmp
目录,该目录不被该命名空间之外的进程共享。
这对于保护对进程临时文件的访问很有用,但是使通过/tmp
或/var/tmp
在进程之间共享变得不可能。如果启用此功能,则在停止服务后,将删除由服务在这些目录中创建的所有临时文件。默认为false。通过使用JoinsNamespaceOf =指令,可以在同一私有/tmp
和/var/tmp
命名空间中运行两个或多个单元,有关详细信息,请参见systemd.unit(5)。
如果设置了DynamicUser=
,则暗示此设置。对于此设置,关于挂载传播和特权的限制与ReadOnlyPaths=
和相关调用相同,请参见上文。启用此设置具有在访问/tmp
和/var/tmp
所需的所有装入单元上添加Requires =和After =依赖项的副作用。
此外,添加了对systemd-tmpfiles-setup.service(8)的隐式After =排序。请注意,可能无法实现此设置(例如,如果安装命名空间不可用),并且应该以不仅仅依赖于此设置的安全性来编写单元。
答案 1 :(得分:0)
已解决!
解决方案:
转到systemd文件获取nrpe。我的被发现在这里:
/lib/systemd/system/nrpe.service
如果不存在,请运行:
找到/-名称“ nrpe.service”
并忽略所有system.slice结果
保存并退出文件,然后运行以下2个命令:
守护进程重新加载 重新启动nrpe.service
问题解决了。
简短说明:造成此问题的主要原因是,在debian 9.x中,某些使用systemd的进程默认情况下会强制使用私有tmp目录。因此,如果您有其他程序在/ tmp中搜索或建立索引时遇到问题,则可以定制此解决方案以使其适合。