2013-01-02 29 views
5

Mam skrypt systemowy, który uruchamia i potokuje wyniki "ps aux | grep utilities" do pliku tekstowego i chowns plik tekstowy, aby usługa internetowa mogła odczytać plik i wyświetlić wyniki w mojej aplikacji internetowej.php do analizy ps aux | grep ... wyniki

Oto przykład surowych wyników:

user  12052 0.2 0.1 137184 13056 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust1 cron 
user  12054 0.2 0.1 137184 13064 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust3 cron 
user  12055 0.6 0.1 137844 14220 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust4 cron 
user  12057 0.2 0.1 137184 13052 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust89 cron 
user  12058 0.2 0.1 137184 13052 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust435 cron 
user  12059 0.3 0.1 135112 13000 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust16 cron 
root  12068 0.0 0.0 106088 1164 pts/1 S+ 10:00 0:00 sh -c ps aux | grep utilities > /home/user/public_html/logs/dashboard/currentlyPosting.txt 
root  12070 0.0 0.0 103240 828 pts/1 R+ 10:00 0:00 grep utilities 

Jak mój skrypt php analizuje ten tekstowy, tylko trzeba wyodrębnić następujące (tylko przykład):

cust1 
cust3 
cust4 
cust89 
cust435 
cust16 

mam Próbowałem wielu różnych niezgrabnych sposobów i nic nie działa dobrze. Sposób, w jaki mam wymienione poniżej, działa, ale czasami pobiera także śmieci, ponieważ liczba "spacji" w linii, która eksploduje po zmianach.

public function showProcesses() { 
    $lines = file(DIR_LOGGER_ROOT . "dashboard/currentlyPosting.txt"); 
    $results = array(); 
    $i = 0; 
    foreach($lines as $line) { 
     if (preg_match("/php/i", $line)) { 
      $userProcess = explode(" ", $line); 
      if($userProcess[29] != "0:00" && strlen($userProcess[29]) < 20) { 
       $results[$i] = $userProcess[29]; 
       $i++; 
      } 
     } 
    } 
    return $results; 
} 

Czy może ktoś z was zamieścił eleganckie rozwiązania? Próbuję nauczyć się lepszych sposobów robienia rzeczy i będę wdzięczny za wskazówki.

+0

Jeśli piszesz app wiersza polecenia, aby to zrobić, proponuję za pomocą języka, lepiej przystosowane do obsługi smyczkowy i regexes jak Perl. Prawdopodobnie można nawet znaleźć coś na CPAN, aby uzyskać bezpośredni dostęp do tabeli procesu, takie jak http://search.cpan.org/dist/Proc-ProcessTable/ –

+0

dane są gromadzone i zapisywane do pliku tekstowego ze skryptu systemowego. powoduje, że plik tekstowy jest dostępny dla mojej aplikacji internetowej bez użycia exec i root z mojej aplikacji internetowej. ale parsowanie wyników dotyczy samej aplikacji internetowej, więc php ma sens. –

Odpowiedz

0

Chciałbym użyć preg_match(). Zrobiłem coś podobnego w wielu skryptach zarządzania systemami. Oto przykład:

$test = "user  12052 0.2 0.1 137184 13056 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust1 cron 
user  12054 0.2 0.1 137184 13064 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust3 cron 
user  12055 0.6 0.1 137844 14220 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust4 cron 
user  12057 0.2 0.1 137184 13052 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust89 cron 
user  12058 0.2 0.1 137184 13052 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust435 cron 
user  12059 0.3 0.1 135112 13000 ?  Ss 10:00 0:00 php /home/user/public_html/utilities/runProcFile.php cust16 cron 
root  12068 0.0 0.0 106088 1164 pts/1 S+ 10:00 0:00 sh -c ps aux | grep utilities > /home/user/public_html/logs/dashboard/currentlyPosting.txt 
root  12070 0.0 0.0 103240 828 pts/1 R+ 10:00 0:00 grep utilities"; 

$lines = explode("\n", $test); 

foreach($lines as $line){ 
     if(preg_match("/.php[\s+](cust[\d]+)[\s+]cron/i", $line, $matches)){ 
       print_r($matches); 
     } 

} 

Powyższe wydruki:

Array 
(
    [0] => .php cust1 cron 
    [1] => cust1 
) 
Array 
(
    [0] => .php cust3 cron 
    [1] => cust3 
) 
Array 
(
    [0] => .php cust4 cron 
    [1] => cust4 
) 
Array 
(
    [0] => .php cust89 cron 
    [1] => cust89 
) 
Array 
(
    [0] => .php cust435 cron 
    [1] => cust435 
) 
Array 
(
    [0] => .php cust16 cron 
    [1] => cust16 
) 

Można ustawić $test równa wyjście z Exec. wartości, których szukasz, znajdują się w oświadczeniu if pod numerem foreach. $matches[1] będzie mieć wartość custx.

1

Można użyć preg_split zamiast explode i podzielić na [ ]+ (jednego lub więcej spacji). Ale myślę, że w tym przypadku można przejść z preg_match_all i capturing:

preg_match_all('/[ ]php[ ]+\S+[ ]+(\S+)/', $input, $matches); 
$result = $matches[1]; 

Wzór pasuje do miejsca, php, więcej przestrzeni, ciąg spoza przestrzeni (ścieżce), bardziej przestrzenie, a następnie oddaje następny ciąg nie-spacji. Pierwsze miejsce polega głównie na zapewnieniu, że nie pasujesz do php jako części nazwy użytkownika, ale tak naprawdę jako polecenia.

Alternatywą dla przechwytywania jest funkcja "zachowaj" w PCRE. Jeśli używasz \K we wzorcu, wszystko, zanim zostanie odrzucony w meczu:

preg_match_all('/[ ]php[ ]+\S+[ ]+\K\S+/', $input, $matches); 
$result = $matches[0]; 
0

Jeżeli liczba miejsc w linii pomiędzy wartościami jest zmienna, można użyć preg_split

Można by po prostu mieć zmienić:

$userProcess = explode(" ", $line); 

do:

$userProcess = preg_split("#\s+#", $line); 

\s+ dopasuje jeden lub więcej spacji, kart lub innych znaków odstępu.

Następnie można uzyskać przedostatnią pozycję z:

$txt = $userProcess[count($userProcess) - 2]; 
Powiązane problemy