gpt4 book ai didi

python - 如何在不重新启动守护进程的情况下读取和截断 snmptrapd 日志文件

转载 作者:太空狗 更新时间:2023-10-29 12:36:00 26 4
gpt4 key购买 nike

我制作了一个执行 nagios 检查的 python 脚本。该脚本的功能非常简单,它只是解析日志并匹配一些用于构建 nagios 检查输出的信息。该日志是一个 snmptrapd 日志女巫,它记录来自其他服务器的陷阱,并在我用脚本解析它们之后将它们记录在 /var/log/snmptrapd 中。为了获得最新的陷阱,我每次阅读后都会从 python 中删除日志。为了保留信息,我做了一个 cron 作业,以比 nagios 检查间隔小一点的时间间隔将日志的内容复制到另一个日志中。我不明白的是为什么日志增长如此之多(我的意思是消息日志我猜有 1000 倍的信息更小)。从我在日志中看到的内容来看,有很多特殊字符,如 ^@ 我认为这是通过我从 pyton 操作文件的方式完成的,但看到我有就像三个星期的经验一样,我似乎无法找出问题所在。

脚本代码如下:

import sys, os, re

validstring = "OK"
filename = "/var/log/snmptrapd.log"

if os.stat(filename)[6] == 0:
print validstring
sys.exit()

else:
f = open(filename,"r")
sharestring = ""
line1 = []
patte0 = re.compile("[0-9]+-[0-9]+-[0-9]+")
patte2 = re.compile("NG: [a-zA-Z\s=0-9]+.*")
for line in f:
line1 = line.split(" ")
if re.search(patte0,line1[0]):
sharestring = sharestring + line1[1] + " "
continue
result2 = re.search(patte2,line)
if result2:
result22 = result2.group()
result22 = result22.replace("NG:","")
sharestring = sharestring + result22 + " "
f.close()
f1 = open(filename,"w")
f1.close()
print sharestring
sys.exit(2)

~

日志看起来像:

2012-07-11 04:17:16 Some IP(via UDP: [this is an ip]:port) TRAP, SNMP v1, community somestring
SNMPv2-SMI::enterprises.OID Some info which is not necesarry
SNMPv2-MIB::sysDescrOID = STRING: info which i'm matching

我很确定这与我删除文件的方式有关,但我无法弄清楚。如果你有一些想法,我会很感兴趣。谢谢。

关于大小的信息,我有 93 行(Vim 这么说),日志占用 161K,这不行,因为行很短。

好的,这与我读取和删除文件的方式无关。当我删除它的日志文件时,snmptrapd 守护程序中的某些东西正在执行此操作。我已经修改了我的代码,现在我在打开文件之前将 SIGSTOP 发送到 snmptrapd,然后我对文件进行了修改,然后在完成后发送了 SIGCONT,但我似乎遇到了相同的行为。新代码看起来像(不同的部分):

else:
command = "pidof snmptrapd"
p=subprocess.Popen(shlex.split(command),stdout=subprocess.PIPE)
pidstring = p.stdout.readline()
patte1 = re.compile("[0-9]+")
pidnr = re.search(patte1,pidstring)
pid = pidnr.group()
os.kill(int(pid), SIGSTOP)
time.sleep(0.5)
f = open(filename,"r+")
sharestring = ""

                  sharestring = sharestring + result22 + " "
f.truncate(0)
f.close()
time.sleep(0.5)
os.kill(int(pid), SIGCONT)
print sharestring

我正在考虑停止守护程序删除文件,然后以适当的权限重新创建它并启动守护程序。

最佳答案

我不认为你可以,但这里有一些事情可以尝试

截断文件

f1 = open(filename, 'w')
f1.close()

是一种删除文件内容的 hacky 副作用方式,如果其他应用程序打开了该文件,则可能会导致不良副作用,具体取决于底层操作系统。

使用文件对象方法 truncate()

truncate([size])

Truncate the file's size. If the optional size argument is present, the file is truncated to (at most) that size. The size defaults to the current position. The current file position is not changed. Note that if a specified size exceeds the file's current size, the result is platform-dependent: possibilities include that the file may remain unchanged, increase to the specified size as if zero-filled, or increase to the specified size with undefined new content. Availability: Windows, many Unix variants.

可能唯一确定性的方法是

在脚本开始时停止 snmptrapd 进程,使用正确的 os 模块 函数 remove 然后重新创建文件并重新启动脚本末尾的 snmptrapd 守护进程。

os.remove(path)

Remove (delete) the file path. If path is a directory, OSError is raised; see rmdir() below to remove a directory. This is identical to the unlink() function documented below. On Windows, attempting to remove a file that is in use causes an exception to be raised; on Unix, the directory entry is removed but the storage allocated to the file is not made available until the original file is no longer in use.

共享资源问题

在没有某种锁定机制的情况下,如果有两个进程试图争夺对单个文件的写入,并且文件中发生了不确定的事情,您仍然可能会遇到问题。我打赌你可以发送一个 SIGINT 或类似于你的守护进程的东西,让它重新读取文件或其他东西,检查你的文档。

在没有独占锁定的情况下操作共享资源,尤其是文件资源会很麻烦,尤其是在文件系统缓存和应用程序数据缓存方面。

关于python - 如何在不重新启动守护进程的情况下读取和截断 snmptrapd 日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11428496/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com