NRPE Python 脚本输出错误

NRPE Python script output bug

我的任务是在远程 NRPE 客户端上制作自定义 python 脚本(因为我不擅长 Bash)到 运行,递归地计算文件数量在 /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.

中的文件的能力上。

我做了什么:

输出:
正确的输出是:OK - 3 files in /tmp

服务器输出供参考:

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文件return。但是,我仍然不知道如何解决这个问题。

systemd 服务文件,也许这个变量设置为 true :)

PrivateTmp= 采用布尔参数。如果为真,则为已执行的进程设置一个新的文件系统命名空间,并在其中安装私有 /tmp/var/tmp 目录,该目录不被命名空间外的进程共享。

这对于保护对进程临时文件的访问很有用,但无法通过 /tmp/var/tmp 在进程之间共享。如果启用,则在服务停止后,这些目录中服务创建的所有临时文件都将被删除。默认为假。通过使用 JoinsNamespaceOf= 指令,可以在同一个私有 /tmp/var/tmp 命名空间中 运行 两个或多个单元,详情请参阅 systemd.unit(5)。

如果设置了 DynamicUser=,则暗含此设置。对于此设置,关于安装传播和权限的相同限制适用于 ReadOnlyPaths= 和相关调用,请参见上文。启用此设置会产生副作用,即在访问 /tmp/var/tmp 所需的所有挂载单元上添加 Requires= 和 After= 依赖项。

此外,添加了 systemd-tmpfiles-setup.service(8) 上的隐式 After= 排序。请注意,此设置的实现可能是不可能的(例如,如果挂载命名空间不可用),并且单元的编写方式不应完全依赖此设置来确保安全。

已解决!

解决方案:

  • 转到 nrpe 的 systemd 文件。我的是在这里找到的:

    /lib/systemd/system/nrpe.service
    
  • 如果没有,运行:

    find / -name "nrpe.service"
    

并忽略所有 system.slice 结果

  • 用vi/nano
  • 打开文件
  • 找到写着 PrivateTmp= 的一行(通常是倒数第二行)
  • 如果设置为true,则设置为false
  • 保存并退出文件并运行执行以下 2 个命令:

    daemon-reload
    restart nrpe.service
    

问题已解决。

简短解释:该问题的主要原因是,对于 debian 9.x,某些使用 systemd 的进程默认强制使用私有 tmp 目录。因此,如果您有任何其他程序在 /tmp 中搜索或索引时遇到问题,可以调整此解决方案以适应。