2015-11-16 2 views
2

У меня есть приложение сторонней библиотеки, которое работает непрерывно и генерирует консольную печать при возникновении какого-либо события. Я хочу предпринять некоторые действия, когда произойдет какое-то конкретное событие, поэтому мне нужно постоянно контролировать печать на консоли, чтобы запустить действие.Постоянно отслеживать журналы консоли Linux, используя приложение C/C++

Можно ли написать приложение, которое может непрерывно контролировать струйный самосвал на консоли (stdout) и выполнять обработку при обнаружении одной строки.

Я попытался использовать функцию «popen», но он продолжает ждать, пока приложение библиотеки прекратит выполнение. Вот мой пример кода с использованием открытой

#include <stdio.h> 

int main() 
{ 
    FILE *fd = NULL; 
    char buf[512] = {0}; 

    fd = popen ("./monitor","r"); 
    while (fgets (buf, 512, fd) != NULL) 
    { 
     printf ("__FILE__ : message : %s\n",buf); 
    } 

    printf ("EOF detected!\n"); 
    return 0; 
} 

Может кто-нибудь пожалуйста, дайте мне знать, как правильно журналов консоли мониторинга и принять меры.

Заранее спасибо.

Pratik

+0

Вы подумали об использовании bash/shell, чтобы решить вашу проблему? – sashang

+0

привет sashang, можете ли вы предоставить какое-то решение на основе этого? – Pratik

ответ

0

Вот пример кусок кода о Я написал недавно, что читает из стандартного ввода и выводит на стандартный вывод.

void echo(int bufferSize) { 
    // Disable output buffering. 
    setbuf(stdout, NULL); 
    char buffer[bufferSize]; 
    while (fgets(buffer, sizeof(buffer), stdin)) { 

     printf("%s", buffer); 
    } 
} 

Как я понимаю, у вас есть такой же вопрос, как я первоначально получение задерживается выход, потому что я не использовал:

setbuf(stdout, NULL); 

Вы также можете прочитать из стандартного ввода (это то, что мой пример кода) просто передайте свою команду на ваш код c или просто хотите фильтровать выходной канал на grep. Если это стандартизированный системный журнал журнала вы также можете использовать хвост на файл журнала:

tail -f <logfile>| <your c prgoramme> 

или для всего filering

tail -f <logfile>|grep "<your string here>" 

или без лог-файлов журналов трубы Stdout таким образом:

<your app>|<your c prgoramme> 

или

<your app>| grep "<your string here>" 
+0

Спасибо, Андреас. У меня есть одно приложение, которое постоянно работает и помещает печать на консоль и хочет подготовить другое приложение, которое анализирует и предпринимает действия в соответствии с отпечатками ...... Я попробовал «setbuf», но он не работает. Пробовал | подход, кажется, работает для меня, просто проблема в том, что мой app2 получает отпечатки app1, когда выполнение app1 завершено. – Pratik

+0

, но мой код работал, и я использовал эту «печать в конце», прежде чем добавить «setbuf (stdout, NULL)», или, может быть, вы делаете что-то по-другому, посмотрите полный код эха [здесь] (https: // github.com/CySC/echo/tree/master/C) вы также можете скачать и изменить его в соответствии с вашими потребностями (так как это действительно базовая вещь), просто отгоняет все, что приходит в stdin – Andreas

+0

, может быть, ваша проблема не в выходе но при чтении ввода , возможно, 'fgets (buf, 512, fd)' слишком большой, но все же я угадываю слишком много, потому что не знаю, что на самом деле записано – Andreas

0

программа третьей партии моделируется скриптом, который записывает на стандартный вывод

#!/bin/bash 
while true; do 
    echo "something" 
    sleep 2 
done 

Вы хотите написать что-то вроде этого, чтобы захватить выход из программы 3-й партии, а затем действовать на информации:

#!/bin/bash 

while read line; do 
    if [[ $line == "something" ]]; then 
     echo "do action here" 
    fi 
done 

Затем объедините их с оператором трубы:

./dosomething.sh | act.sh 
+0

Почему бы просто не пропустить трубку? – Andreas

+0

, потому что он хочет что-то сделать после нахождения строки и продолжить чтение с ввода. – sashang

Смежные вопросы