我的任务是制作一个自定义的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
,并收到警告:1300 files in /tmp
。似乎问题仅在于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 - 3 files in /tmp
- 当我以 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 文件返回。但是,我仍然不知道如何解决此问题。
systemd 服务文件,也许这个 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= 排序。请注意,此设置的实现可能无法实现(例如,如果装载命名空间不可用(,并且单元的编写方式不应仅依赖于此设置以确保安全。
解决了!
溶液:
-
转到您的系统文件以获取 nrpe。我的是在这里找到的:
/lib/systemd/system/nrpe.service
-
如果不存在,请运行:
find / -name "nrpe.service"
并忽略所有系统切片结果
- 使用 vi/nano 打开文件
- 找到一行显示
PrivateTmp=
(通常是倒数第二行( - 如果设置为 true,则将其设置为 false
-
保存并退出文件并运行以下 2 个命令:
daemon-reload restart nrpe.service
问题解决了。
简短解释:这个问题的主要原因是,在 debian 9.x 中,一些使用 systemd 的进程默认强制使用私有 tmp 目录。因此,如果您有任何其他程序在/tmp
中搜索或索引时遇到问题,则可以定制此解决方案以适应。