Radek Chalupa   konzultace a školení programování, vývoj software na zakázku

Vlastní sledování využití paměti v panelu Xfce

16.2.2020

V Linuxu existuje celá řada způsobů jak rychle sledovat míru využití operační paměti. Z terminálu můžeme například zavolat příkazy free nebo top. Dále například program conky, který umí vypisovat nejrůznější systémové informace na plochu. Pokud ovšem nemáte více monitorů s "nadbytečným" místem, člověk při práci většinou využívá celou dostupnou pracovní plochu a tyto informace jsou (bez použití klávesové zkratky pro rychlé zobrazení plochy) skryté.

Pro operativní zobrazování krátkých informací jsou ideální panely, zůstávající stále viditelné na okraji obrazovky. Pro standardní panel prostředí Xfce je k disposici plugin xfce4-genmon-plugin, který umožňuje ve zvoleném časovém intervalu vypisovat do panelu výstup z vybraného příkazu/aplikace. Takže ideální volba v případě, že si chceme napsat vlastní aplikaci, která bude zobrazovat jen a pouze to co právě chceme.

Napíšeme si jednoduchý program v C++, který načte potřebné údaje z virtuálního souboru /proc/meminfo a zobrazí procenta využité paměti a celkovou velikost paměti. Samozřejmě není nic jednoduššího než si úpravou formátu ve funkci printf přizpůsobit výstup podle svých požadavků.

Soubor /proc/meminfo budeme číst po řádcích funkcí fgets a hledat řádky uvedené texty "MemTotal" a "MemAvailable", z nichž načteme hodnoty celkové a dostupné paměti. Jejich rozdílem získáme využitou paměť a pak už je to jen o výpočtu procent a zobrazení výsledků. Celý kód v C++ může vypadat následovně:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char const *argv[])
{
	FILE* fmi = fopen("/proc/meminfo", "r");
	if (nullptr == fmi)
	{
		printf("ERR");
		return EXIT_FAILURE;
	}
	char line[255];
	unsigned int mem_total;
	unsigned int mem_avail;
	unsigned int end = 0;
	while (fgets(line, sizeof(line), fmi))
	{
		if (sscanf(line, "MemTotal: %u kB", &mem_total) == 1)
		{
			end |= 1;
		}
		if (sscanf(line, "MemAvailable: %u kB", &mem_avail) == 1)
		{
			end |= 2;
		}
		if (3 == end)
			break;
	}
	fclose(fmi);
	printf("%d %c z %.2f GiB",
		100*(mem_total - mem_avail) / mem_total,
		'%',
		(double)((double)mem_total / 1024 / 1024));
	return 0;
}

Kód přeložíme překladačem GCC následovně:

g++ panel-free-mem-info.cpp -O3 -opanel-free-mem-info

Nyní již zbývá jen nainstalovat ze standardních repositářů (pokud již není) balík xfce4-genmon-plugin a přidat jej na panel Xfce (v české verzi bude nejspíš pod názvem "Obecné sledování"). V jeho nastavení pak zadáme jako příkaz cestu k přeloženému programu a nastavíme rozumný interval aktualizace a font.