я сделал скрипт python, который выполняет проверку nagios. Функциональность скрипта довольно проста, он просто анализирует журнал и сопоставляет некоторую информацию, которая используется для построения вывода проверки 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), а журнал занимает 161 КБ, и это не нормально, потому что строки довольно короткие.
Хорошо, это не имеет ничего общего с тем, как я прочитал и стер файл. Что-то в демоне 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
Я думаю о том, чтобы остановить демона, стирающего файл, а затем воссоздать его с соответствующими разрешениями и запустить демон.
daemon
ты говоришь? мы не знаем, что вы знаете. предоставьте больше деталей, чем вы думаете, что вам нужно. - person   schedule 11.07.2012open(..., O_TRUNC)
, а затемclose
, я думаю, вы заставите писателей создать файл с дырками. Это могло бы объяснить ^@ (обычное представление нулевого байта), поскольку нулевые байты - это то, как дыры (нераспределенное хранилище) представляются пользовательскому пространству при чтении. Если это так, я боюсь, если другие процессы, которые пишут файл журнала, не будут сотрудничать (например, разрешив отправить им SIGHUP, чтобы повторно открыть файл журнала), вы не сможете избежать нехватки места. - person fork0   schedule 11.07.2012