нужно читать данные из журнала ... tail, grep и inotifywait - PullRequest
5 голосов
/ 24 сентября 2010

У меня есть данные на одном сервере, которые поступают в постоянно растущий файл журнала. Мне нужно подключить этот журнал и grep некоторую информацию, а затем отправить ее на другой сервер для php для вставки в базу данных. Компьютер, на котором есть журнал, не может получить доступ к базе данных. Я пробовал это до сих пор, но мой синтаксис в команде bash неверен, и я не могу понять, так ли это, или есть ли лучший способ? Netcat была еще одна мысль ...

monitor.sh

#!/bin/sh

tail -f /usr/local/log/thelog.log | grep -B1 "ABC=" > /usr/local/log/output.log;  

while inotifywait -e modify /usr/local/log/output.log; do
sleep 10;  
php /usr/bin/send.php;  
done

send.php

<?php
//extract data from the post
//extract($_POST);
//set POST variables

$data = 'tail -n 3 /usr/local/log/output.log';
$url = 'http://www.blahblah.com/logtodb.php';

$data = str_replace("A", "", $data);
$data = str_replace("B=", "", $data);
$data = str_replace("C=", "", $data);
$data = str_replace("D=", "", $data);

$fields = array(
'data'=>urlencode($data)d,
);

//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string,'&');

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

   //execute post
   $result = curl_exec($ch);

   //close connection
   curl_close($ch);
   A>

logtodb.php читает сообщение

Ответы [ 3 ]

3 голосов
/ 24 сентября 2010

Чтобы выполнить внешнюю команду в PHP, вам нужно использовать обратные галочки, а не одинарные кавычки .Они обычно находятся под клавишей ESC на клавиатуре.

$data = 'tail -n 3 /usr/local/log/output.log';

должно быть

$data = `tail -n 3 /usr/local/log/output.log`;

Кроме того, вы не должны использовать tail -f, поскольку он не возвращается, покапредоставить EOF (контроль + D).

1 голос
/ 24 сентября 2010

Вы можете попробовать это:

#!/bin/sh
tail -f /usr/local/log/thelog.log | grep -B1 "ABC=" | while read line
do
    php /usr/bin/send.php $line
done

Примечание: вам придется изменить send.php, чтобы принимать данные в качестве аргумента (вместо чтения их из выходного журнала).

1 голос
/ 24 сентября 2010

Я никогда не делал этого, но это должно (вероятно) работать:

Почему бы просто не использовать доменный сокет (FIFO)?

$ mkfifo /path/to/my/fifo
$ tail -f /path/to/log > /path/to/my/fifo &
$ php send.php < /path/to/my/fifo

send.php должен иметь возможность просто зацикливаться на $ line = fread (...) с этого момента и до вечности ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...