MIERZWASTUDIO

Szkic do sprawdzenia — przed publikacją

LINUX • LXQt

Jak zrobić monitor CPU, RAM i sieci do panelu Linuksa

Chcesz jednym spojrzeniem sprawdzić, czym właśnie zajmuje się komputer? Zróbmy mały monitor CPU, RAM i sieci do panelu LXQt. Bez wyprawy przez pięć okien za każdym razem, gdy wentylator postanowi zabrać głos.

Pomysł był prosty: komputer pracuje, a my chcemy widzieć, czy ma dużo roboty, czy tylko robi takie wrażenie. Tak powstał nasz JM CPU RAM NET — wykres CPU, krótkie odczyty pamięci i sieci oraz monitor systemu otwierany kliknięciem. Pokażemy, jak to poskładać. Źródła przenośnej wersji czekają na dole.

1. Najpierw ustalmy, co zmieści się w panelu

Pierwotna wersja mieści się w 118 pikselach: napis CPU, szesnastosegmentowy wskaźnik, R dla pamięci i N dla sieci. Mało miejsca, ale panel to nie sala kinowa. Szczegóły pokazują się po najechaniu, a lewy przycisk otwiera monitor systemu. Tak wynika z kodu istniejącej wtyczki; nie jest to pomiar jej własnego obciążenia.

2. Rozdziel odczyt danych i rysowanie

Pierwotny projekt składa się z pliku C++ z widżetem i klasami wtyczki, pliku .desktop opisującego element dla panelu oraz skryptu pomocniczego zbierającego RAM i sieć. Widżet dziedziczy po QWidget, klasa wtyczki po ILXQtPanelPlugin, a fabryka implementuje ILXQtPanelPluginLibrary. Metadane Qt pozwalają panelowi rozpoznać bibliotekę.

Na początek zrób najprostszy widżet z nieruchomym tekstem. Nawet zwykłe „działa” wystarczy — na tym etapie będzie to całkiem dobra wiadomość. Kiedy panel go załaduje, dodaj odczyty. Dzięki temu nie pomylisz problemu z rejestracją dodatku z błędem obliczeń.

3. Obciążenie CPU licz z różnicy odczytów

Pierwszy wiersz /proc/stat podaje liczniki czasu procesora od uruchomienia systemu. To nie jest gotowy procent bieżącego obciążenia. Potrzebujesz dwóch odczytów: zapamiętujesz pierwszy, przy następnym liczysz różnicę. Dopiero wtedy wiadomo, co procesor robił między jednym spojrzeniem a drugim.

quint64 idleAll = idle + iowait;
quint64 nonIdle = user + nice + system + irq + softirq + steal;
quint64 total = idleAll + nonIdle;
// Compare these counters with the previous reading.
// CPU% = 100 * (deltaTotal - deltaIdle) / deltaTotal;

W tym sposobie liczenia bezczynność obejmuje idle i iowait. Liczymy łączne obciążenie procesorów, nie osobne rdzenie. Pierwszy odczyt jest punktem odniesienia. W liczniku sumarycznym nie dodajemy ponownie guest i guest_nice, ponieważ te czasy są już uwzględnione w user i nice. iowait ma ograniczenia interpretacyjne opisane w dokumentacji jądra — nie jest dokładnym miernikiem czasu oczekiwania pojedynczego procesu.

4. RAM: użyj MemAvailable, nie samego MemFree

RAM lubi wyglądać na zajęty, bo Linux wykorzystuje pamięć także jako podręczną. Dlatego odczytujemy MemTotal i MemAvailable z /proc/meminfo, a wynik liczymy jako 100 × (MemTotal − MemAvailable) / MemTotal. MemAvailable szacuje pamięć dostępną dla aplikacji bez swapowania. Dzięki temu nie ogłaszamy alarmu tylko dlatego, że system trzyma coś przydatnego w pamięci.

Obsłuż brakujące pola i dzielenie przez zero. Gdy odczyt się nie uda, pokaż „brak danych”. Zmyślone 0% wygląda spokojnie, ale komputer nie potrzebuje aż tak kreatywnej księgowości.

5. Sieć: bajty na sekundę to nie procent łącza

Dane sieciowe bierzemy z /proc/net/dev: liczniki odebranych i wysłanych bajtów. Liczymy ich przyrost i dzielimy przez czas między próbkami. Dostajemy B/s, czyli bajty na sekundę. Jeśli potrzebujesz bitów na sekundę, pomnóż przez osiem. Jedna mała literka, a różnica całkiem konkretna.

Pierwotny skrypt sumuje ruch aktywnych interfejsów, pomijając lo i wybrane interfejsy wirtualne. IFACE podaje pierwszy pasujący interfejs, więc nie musi opisywać całej sumy. Przy VPN i kilku kartach łatwo o zagadkę „skąd taki transfer?”. W paczce do pobrania wybieramy już jeden interfejs i pozwalamy wskazać go samodzielnie.

N to umowna skala aktywności, nie procent przepustowości łącza. Dla przykładu transfer od 50 do mniej niż 100 KiB/s daje N62. Nie oznacza to, że zajęliśmy 62% możliwości połączenia. Internetu nie mierzymy tu linijką od zera do stu; rzeczywiste RX i TX w KiB/s są w opisie wersji do pobrania.

6. Odświeżaj dane bez zatrzymywania panelu

Pierwotna wtyczka odświeża odczyty co sekundę. Taki rytm wystarcza do szybkiego spojrzenia, bez nerwowego migania:

QTimer *timer = new QTimer(mWidget);
QObject::connect(timer, &QTimer::timeout, mWidget, [this]() {
    if (mWidget) mWidget->updateStats();
});
timer->start(1000);

W pierwotnej wersji C++ uruchamia skrypt przez QProcess i czeka do 800 ms. Panel nie powinien jednak czekać razem z nim, jak na spóźniony autobus. Przy długim oczekiwaniu interfejs może zwalniać. Można użyć asynchronicznych sygnałów QProcess; w paczce 1.0.0 wybraliśmy bezpośredni odczyt lekkich plików /proc. Jeżeli korzystasz z procesu pomocniczego, nie uruchamiaj następnego pomiaru, zanim poprzedni się skończy.

7. Dodaj kolory, opis i kliknięcie

QPainter rysuje wskaźnik CPU, a kolory zmieniają się wraz z obciążeniem. RAM ma własne progi. Zostaw jednak litery i liczby: kolor ma pomagać, a nie urządzać czytelnikowi egzamin z odróżniania odcieni. Opis po najechaniu powinien wyjaśniać wskaźniki.

Kliknięcie próbuje otworzyć dostępne monitory systemu, zaczynając od qps. Bez uprawnień administratora — chcemy obejrzeć liczby, nie przejąć dowodzenie nad komputerem. Jeśli korzystasz ze skryptu, pobieraj jego ścieżkę z katalogu domowego lub konfiguracji. Własny katalog wpisany na stałe sprawi, że u Ciebie będzie działać, a u innych zacznie się zgadywanie.

8. Zbuduj dodatek dla swojej wersji panelu

Do budowania potrzebujesz kompilatora C++, narzędzi Qt z moc, nagłówków używanej wersji panelu oraz odpowiednich bibliotek LXQt. Plik .desktop zawiera nazwę widoczną na liście dodatków i X-LXQt-Module odpowiadający nazwie biblioteki. Korzystaj z interfejsu pasującego do zainstalowanej wersji LXQt; gotowej biblioteki .so nie należy traktować jako uniwersalnej dla każdej instalacji.

Zanim zmienisz panel, zachowaj kopię konfiguracji. Potem zbuduj i zainstaluj bibliotekę, a element dodaj przez ustawienia panelu. Nie podmieniaj działającego dodatku biblioteką dla innej wersji Qt. Kopia zapasowa jest znacznie przyjemniejsza niż wieczór pod hasłem „gdzie się podział mój panel?”.

Co sprawdzić przed codziennym używaniem?

  • Stan bez obciążenia i podczas pracy programu.
  • Brak sieci, zmianę karty, VPN i wyzerowanie liczników.
  • Błąd lub zbyt długie działanie skryptu pomocniczego.
  • Wygląd przy innej wysokości panelu i skalowaniu ekranu.
  • Czy kliknięcie otwiera faktycznie zainstalowany monitor systemu.

Opisujemy rzeczywisty projekt, ale nie dopisujemy mu osiągów z wyobraźni. Nie mamy pomiarów jego narzutu ani potwierdzonej instalacji na wszystkich dystrybucjach. Zakres sprawdzenia paczki znajdziesz niżej. Własną wersję warto spokojnie obejrzeć w codziennej pracy — najlepiej zanim powierzysz jej stałe miejsce obok zegarka.

Dokumentacja

Panel LXQt · Interfejs wtyczek · Dokumentacja /proc. Przykład: własny projekt JM CPU RAM NET.

Pobierz kompletny projekt źródłowy

MIERZWA Panel Monitor 1.0.0 to przenośna wersja rozwinięta z pierwotnego projektu opisanego powyżej. Ma osobną nazwę modułu i widżet szerokości 190 pikseli. Odczytuje liczniki bezpośrednio, bez pierwotnego skryptu pomocniczego i oczekiwania na jego proces. N pozostaje skalą aktywności; transfer RX/TX znajdziesz w opisie po najechaniu.

Pobierz źródła ZIP · 1.0.0 · 14.7 KiB ↗

Paczka zawiera źródła C++, Makefile, sprawdzenia, licencję MIT i instrukcje PL/EN: budowanie, instalacja oraz usuwanie. Sprawdzono na Arch Linux z LXQt Panel 2.4.1 i Qt 6.11.2. Bez gotowych plików wykonywalnych. Dotychczasowe moduły panelu nie są nadpisywane. Inne dystrybucje wymagają osobnego sprawdzenia.

Budowanie i sprawdzenie

clear
make -j2
make check

Instalacja w sprawdzonym układzie Arch Linux

clear
sudo make install LIBDIR=/usr/lib DATADIR=/usr/share

Usuwanie po usunięciu elementu z panelu

clear
sudo python3 uninstall.py --libdir /usr/lib --datadir /usr/share

Polecenia wykonuj w rozpakowanym katalogu projektu. Najpierw przeczytaj README i zachowaj kopię panel.conf. Budowanie i sprawdzenia offscreen przeszły; nie wykonano długiego testu codziennej pracy w panelu.

SHA-256ec47bf34555256f9bcffaaf8520d399491684bb313e2b36bdd3cf58ed3219251