logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Linux: Użycie procesora. Top - czy da się przefiltrować wynik?

sirsimon 09 Lis 2006 21:17 15160 8
REKLAMA
  • #1 3206797
    sirsimon
    Poziom 11  
    Posty: 52
    Pomógł: 2
    Witam!!

    Mam następujący problem. Chciałbym zrobić w PHP interfejs, który wyświetlałby jak w ostatnim czasie wykorzystany był procesor. Serwer apache (do PHP) jest postawiony na Debianie.

    Myślałem by zrobić to w taki sposób:
    - najpierw sprawdzić jakimś poleceniem zużycie procesora i wyniki przekierować do pliku
    - pobrać z pliku daną i zapisać do bazy poprzez PHP

    Jednak jedynym znanym mi poleceniem pokazującym użycie procesora jest "top", ale jest to polecenie, które wyświetla wiele, wiele więcej informacji.

    Czy da się jakoś przefiltrować wynik tego polecenia, by mieć jedynie procentowo użycie procesora? A może trzeba zainstalować jakiś program, który potrafi coś takiego zrobić?

    Z góry dziękuję za pomoc!
  • REKLAMA
  • #2 3207501
    _Damian_
    Poziom 21  
    Posty: 401
    Pomógł: 44
    Ocena: 11
    Można odfiltrować polecenie top. Wystarczy wpisać:
    
    top | grep Cpu
    


    Wynikiem tego polecenia będzie, okrojone do zużycia procesora, polecenie top np:

    
    Cpu(s):  0.7% us,  0.0% sy,  0.0% ni, 99.3% id,  0.0% wa,  0.0% hi,  0.0% si
    


    Wynik tego polecenia zapisuje się do pliku, więc wystarczy napisać prosty skrypcik, który np. co 5min będzie pobierał z tego pliku odpowiednie dane.
  • REKLAMA
  • #3 3207527
    Driver-
    Poziom 38  
    Posty: 2625
    Pomógł: 498
    Ocena: 184
    W jakim środowisku graficznym pracujesz, jeśli w KDE to zainstaluj ksysguard. W tym programie nasz sensory które możesz dowolnie aktywować i sprawdzać co tylko chcesz, oprócz tego masz możliwość obserwacji uruchomionych procesów i wysyłania do nich sygnałów bez użycia konsoli. Nie warto tego robić w PHP, pisze w PHP, nie da Ci ono takich możliwości jak program.
  • REKLAMA
  • #4 3208710
    sirsimon
    Poziom 11  
    Posty: 52
    Pomógł: 2
    Wiem, Driver-, że programem można zrobić o wiele więcej. Chodzi o to, że to musi być w PHP:) No i do tego wogóle bez powłoki graficznej...

    _Damian_'a pomysł bardziej mi się przyda. Jeszcze tylko muszę wyciągnąć samą liczbę w procentach :D

    Dodano po 9 [minuty]:

    Wciąż mam problem. Kiedy napiszę:

    top | grep Cpu > plik.txt


    niestaty plik jest pusty. Spróbowałem napisać coś takiego:

    top | grep Memory > plik.txt


    i otrzymałem rezultat:

    Memory: 4096M real, 2820M free, 2261M swap in use, 4949M swap free


    Nie wiem dlaczego w pierwszym przypadku plik pozostaje pusty. Może polecenie top musi działać dłużej, żeby wyświetlić wyniki. Bo gdy użyję je bez żadnych parametrów (pozostaje aktywne po uruchomieniu), dopiero po ok. sekundzie wyświetlona jest linia, której potrzebuję.
  • REKLAMA
  • #5 3208830
    _Damian_
    Poziom 21  
    Posty: 401
    Pomógł: 44
    Ocena: 11
    Spróbuj użyć polecenia
    
    top -d0.5 | grep Cpu > procesor.txt
    


    Parametr -d odpowiada za prędkość odświeżania informacji. (W tym przypadku 0.5 sek)
    W każdym razie u mnie działa nie zależnie od parametru. Sprawdź jakie masz prawa dostepu do Twojego katalogu domowego. Być może tutaj jest problem?
  • #7 3288531
    sirsimon
    Poziom 11  
    Posty: 52
    Pomógł: 2
    Udało mi się tak przerobić to polecenie, żeby wyświetlało działanie (suma wszystkich działań procesora). Po odczytaniu i podstawieniu do zmiennej powinno zwrócić zajętość procesora:
    
    top -d2 | 
    grep states | 
    sed -e 's/CPU states: /0 */g;
    s/% idle, / +/g; 
    s/% user, / +/g; 
    s/% kernel, / +/g; 
    s/% iowait, / +/g; 
    s/% swap//g;' 
    >> plik.txt
    

    Ale pojawił się kolejny problem. Po dłuższym działaniu systemu, plik do którego dopisuję ma bardzo dużo wpisów. Czy nie dało by się (przy dopisywaniu np.) zrobić tak, żeby wpisów była zawsze stała ilość, i przy osiągnięciu limitu, kasowany był najstarszy wpis, a dodawany najnowszy.

    Czy jest jakieś polecenie w Linux'ie, które mógłbym użyć??

    Proszę o wyrozumiałość.
  • #8 3378730
    sirsimon
    Poziom 11  
    Posty: 52
    Pomógł: 2
    Udało mi się przebrnąć przez ten problem:) Posłużyłem się poleceniem tail, które służy do wyświetlania określonej liczby linii pliku. Przekierowałem rezultat potokiem do tymczasowego pliku, dopisałem kolejną linię i całość przepisałem do oryginalnego pliku.

    Pojawił się jednak jeszcze trudniejszy problem. Zawartość pliku, który jest rezultatem działania poleceń konsoli, inaczej wygląda przy podglądzie w konsoli a inaczej przy odczycie przez inny program.

    Np. plik w konsoli wygląda tak:
    ubuntu@ubuntu:~$ cat linia.txt
    7.0 3.2 0.1  83.5 6.3 0.0 0.1
    

    A w rzeczywistości tak:
     [m (B [39;49m [m (B7.0  [m (B [39;49m [m (B [39;49m [m (B3.2  [m (B [39;49m [m (B [39;49m [m (B0.1  [m (B [39;49m [m (B [39;49m [m (B 83.5  [m (B [39;49m [m (B [39;49m [m (B6.3  [m (B [39;49m [m (B [39;49m [m (B0.0  [m (B [39;49m [m (B [39;49m [m (B0.1  [m (B [39;49m [m (B [39;49m [K
    


    Jak mógłbym zapisać dane z polecenia do pliku, żeby pominąć to dziwne formatowanie?
  • #9 3518541
    sirsimon
    Poziom 11  
    Posty: 52
    Pomógł: 2
    No i się udało :D Proszę, oto cały skrypt, który zapisuje do pliku 150 ostatnich wyników programu "top":

    #!/bin/sh
    
    while [ 0 ]
    do
      ile=`cat plik.txt | wc -l`
    
      if [ $ile -ge 150 ]
      then
        echo `tail +2l plik.txt > plik.tmp`
        echo `cat plik.tmp > plik.txt`
      fi
    
      echo `top -b -n2 | grep Cpu | sed -e "s/%//g;" > dwie.txt `
      echo `tail +2l dwie.txt > linia.txt`
      echo `./linia >> plik.txt`
    done
    
    exit 0
    


    A do przeliczania i zamieniania na liczbę wyniku służy program "linia", który napisałem w C++:

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main(){
        ifstream plik("linia.txt");
        char str[50];
        double d;
        double suma=0, wynik;
        for(int x = 0; x <= 13; x++)
        {
    	if ((x==1) || (x==3) ||(x==5) || (x==9) || (x==11) || (x==13))
    	{
    	    plik >> d;
    	    suma += d;
    	}
    	else
    	    plik >> str;
        }
        wynik = static_cast <int> (suma);
        if((suma-wynik) >= 0.5)
            cout << ++wynik << endl;
        else
            cout << wynik << endl;
        return 0;
    }
    


    A tutaj całość:
    - program w C++ - przeliczanie danych z polecenia "top" i zapisywanie do pliku liczby
    - skrypt w BASH - usuwanie starych, zapisywanie nowych danych i uruchamianie w/w programu
    - strona PHP - wyświetlanie wyniku w postaci wykresu, czyli zużycie procesora na stronie
    - pliki GIF - pliki służące do graficznego zobrazowania wyników na stronie internetowej

    Aby wykres się zmieniał, skrypt "procent.sh" musi zostać uruchomiony ręcznie (./procent.sh) z katalogu, w którym się znajduje. Wszystkie pliki muszą znajdować się w tym samym katalogu. Skrypt i program muszą mieć prawo do zapisu, odczytu i uruchamiania. Wszystko działa w Linux'ie (tryb tekstowy).

    Rozmiar: 52,65 KB
    Załączniki:
    • Procent.rar (52.65 KB) Musisz być zalogowany, aby pobrać ten załącznik.

Podsumowanie tematu

✨ Dyskusja dotyczy sposobu monitorowania i zapisywania procentowego wykorzystania procesora na serwerze Debian z użyciem PHP, bez środowiska graficznego. Proponowano filtrowanie wyniku polecenia "top" za pomocą grep, np. "top | grep Cpu", aby uzyskać tylko linie z informacją o zużyciu CPU. Problemem było jednak uzyskanie wyniku w pliku, gdyż "top" działa interaktywnie i wymaga parametrów takich jak "-b" (tryb batch) i "-n" (liczba iteracji), aby wynik był dostępny do przetwarzania. Zaproponowano użycie "top -b -n2 | grep Cpu" do uzyskania danych. Dodatkowo pojawił się problem z nadmiernym rozrostem pliku z wynikami, co rozwiązano przez stosowanie polecenia "tail" do utrzymania stałej liczby linii w pliku. Autor stworzył skrypt shellowy, który cyklicznie zbiera dane, filtruje je i zapisuje do pliku, a następnie program w C++ przetwarza linie na wartości liczbowe. Wskazano także na problem z kodowaniem i formatowaniem znaków w pliku wynikowym, który wymagał dodatkowego czyszczenia. Alternatywnie zasugerowano użycie narzędzia ksysguard w środowisku KDE, jednak autor potrzebował rozwiązania działającego w PHP i bez GUI.
Wygenerowane przez model językowy.
REKLAMA