Debian Debian-France Debian-Facile Debian-fr.org Debian-fr.xyz Debian ? Communautés

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 07-05-2021 20:26:37

Tawal
Membre
Distrib. : Debian 11 Bullseye
Noyau : Linux 5.10.0-9-amd64
(G)UI : Xfce
Inscription : 25-02-2021

[gawk] Processus Swapés

Hello,

Je poste ici un petit script qui n'est qu'à 5% de moi tongue
Au début, c'était mon idée et c'était un script pur bash mais il en a été discuté ici et, puisque j'utilisais awk (à mauvaise efficience), il m'a été conseillé de n'utiliser que gawk pour faire le même boulot que le script en bash.

Je m'y suis attelé, mais ma méconnaissance de awk/gawk m'a fait sortir "des horreurs", et @Watael m'a finalement mâché le taf smile
Voir ici

Donc ce script liste les processus qui occupent une place (mini 4kB) dans le swap.
Et si il n'y a aucun processus swapé, ben ça répond qu'il n'y en a pas lol

Voici :

#!/bin/bash

gawk 'function b2h(mem,    x){
        m=mem
        while(int(m/=kB))x++
        return x
    }

    BEGIN{
        kB=1000; kiB=1024
        unit2exp["kB"]=kiB**1; unit2exp["MB"]=kiB**2; unit2exp["GB"]=kiB**3
        exp2unit[1]="kB";     exp2unit[2]="MB";     exp2unit[3]="GB"
    }

    /^Name:/ {
        name=$2
    }
    /^Tgid:/ {
        tgid=$2
    }    
    /^VmSwap:/ && $2>0 {
        byteSize=$2*unit2exp[$3]
        procName[tgid]=name
        procSwap[tgid]=byteSize
        totSwap+=byteSize
    }

    END{
        PROCINFO["sorted_in"]="@val_num_desc"

        if (totSwap>0) {
            printf("%-18s %5s %11s\n\n", "NOM", "PID", "TAILLE")
            for (pid in procSwap) {
                sizeSwap=procSwap[pid]
                xp=b2h(sizeSwap)
                if (xp==1) {
                   printf("%-18s %5d %8d %s\n", procName[pid], pid, sizeSwap/kB^xp, exp2unit[xp])
                }else{
                    printf("%-18s %5d %8.1f %s\n", procName[pid], pid, sizeSwap/kB^xp, exp2unit[xp])
                }
            }
            xp=b2h(totSwap)
            if (xp==1) {
                printf("\nVolume occupé en Swap : %d %s\n\n",totSwap/kB^xp, exp2unit[xp])
            }else{
                printf("\nVolume occupé en Swap : %.1f %s\n\n",totSwap/kB^xp, exp2unit[xp])
            }
        }else{
            printf("Aucun processus en swap.\n")
        }
    }'
/proc/[0-9]*/status 2>/dev/null

exit $?


J'ai appelé le script procswap
Swap vide :

$ ./procswap
Aucun processus en swap.
$


Swap occupé partiellement (heureusement scratchhead.gif) :

$ ./procswap
NOM                  PID      TAILLE

Xorg                 943      3.6 MB
lightdm              908      1.0 MB
unattended-upgr      898      792 kB
accounts-daemon      803      396 kB
xfce4-notifyd       1852      380 kB
udisksd              784      360 kB
ssh-agent           1480      340 kB
dbus-daemon          792      320 kB
pulseaudio          1660      232 kB
NetworkManager       794      220 kB
lightdm             1432       76 kB
(sd-pam)            1439       64 kB
cups-browsed         886       60 kB
upowerd             1577       32 kB
gvfsd               1580       32 kB
at-spi-bus-laun    12075       28 kB
cupsd                800       24 kB
alsactl              787       20 kB
evolution-calen     2081       16 kB
systemd-timesyn      749        8 kB
rsyslogd             791        4 kB
wpa_supplicant       793        4 kB
exim4               1265        4 kB

Volume occupé en Swap : 8.1 MB

$


Les unités sont en puissances de 1000 => 1MB=1000 kB.

Vli, vlà, vloù, ça égaie un peu cette section et puis je ne connais pas d'équivalent.
.

Dernière modification par Tawal (07-05-2021 22:23:14)


Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#2 07-05-2021 21:35:05

raleur
Membre
Inscription : 03-10-2014

Re : [gawk] Processus Swapés

Tawal a écrit :

Les unités sont en puissances de 1000


En tenant compte du fait que les valeurs récupérées dans /proc sont en fait des KiB (1024) et non des kB ?


Il vaut mieux montrer que raconter.

Hors ligne

#3 07-05-2021 22:12:38

Tawal
Membre
Distrib. : Debian 11 Bullseye
Noyau : Linux 5.10.0-9-amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : [gawk] Processus Swapés

Ah en voilà une info que je ne trouvais pas !
Je me suis appuyé sur le S.I pour les unités, et dans /proc on trouve l'unité "kB" qui dans le S.I vaut 1000 B ...
Merci de cette précision smile

Et ce n'est pas grand chose à changer dans le script wink

Edit: Script à jour pour les unités wink

Dernière modification par Tawal (07-05-2021 22:24:26)


Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#4 19-10-2021 20:53:50

Tawal
Membre
Distrib. : Debian 11 Bullseye
Noyau : Linux 5.10.0-9-amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : [gawk] Processus Swapés

Hello,

Je relance le sujet car le script du #1 n'est pas tout à fait exact !
Je m'explique :
J'ai fait "swapé" ma machine et lancé le script.
C'est ok, j'ai bien la liste des processus utilisant le swap.
Ensuite, j'ai passé ces 2 commandes :

swapoff -a


et

swapon -a


pour relancer le script et ....
quelques processus sont encore listés !!!

Je suis donc allé voir le man de /proc :

man proc


Et dans la partie /proc/[pid]/status au niveau de VmSwap, on lit :

man proc a écrit :

This value is inaccurate.


ce qui veut dire qu'elle est inexacte !

Et donc si la machine "re-swape", il est possible que des processus soient listés alors qu'ils n'ont pas de mémoire en swap.

Par contre dans le fcihier /proc/[pid]/smaps, on trouve la valeur de mémoire en swap mais pour chaque thread du processus en question.
J'ai donc réécrit le script pour qu'il compile ces valeurs pour chaque processus.
Et après les commandes swapoff -a et swapon -a, la liste des processus utilisant le swap est bien vide.
Mais l'accès à certains fichiers /proc/[pid]/smaps demande des droits root.
Il faut donc utiliser ce nouveau script avec des droits root.
Voici ce que j'ai écrit :

#!/bin/bash

tail -n +1 /proc/[0-9]*/smaps 2>/dev/null | gawk '
    function b2h(mem,    x){
        m=mem
        while(int(m/=ko))x++
        return x
    }
    BEGIN{
        ko=1000; kB=1024
        unit2exp["kB"]=kB**1; unit2exp["mB"]=kB**2; unit2exp["gB"]=kB**3
        exp2unit[1]="ko";     exp2unit[2]="Mo";     exp2unit[3]="Go"
    }
    END{
        PROCINFO["sorted_in"]="@val_num_desc"
        if (totSwap>0) {
            printf("%-18s %7s %12s\n\n", "NOM", "PID", "TAILLE")
            for(pid in procSwap){
                sizeSwap=procSwap[pid]
                xp=b2h(sizeSwap)
                if(xp==1){
                    printf("%-18s %8d %8d %s\n", procName[pid], pid, sizeSwap/ko^xp, exp2unit[xp])
                }
                else{
                    printf("%-18s %8d %8.1f %s\n", procName[pid], pid, sizeSwap/ko^xp, exp2unit[xp])
                }
            }
            xp=b2h(totSwap)
            if(xp==1){
                printf("\nVolume occupé en Swap : %d %s\n\n",totSwap/ko^xp, exp2unit[xp])
            }
            else{
                printf("\nVolume occupé en Swap : %.1f %s\n\n",totSwap/ko^xp, exp2unit[xp])
            }
        }else{
            printf("Aucun processus en swap.\n")
        }
    }
    {
        if (/^==>/) {
            f=$2
            tgid=gensub(/\/proc\/([0-9]*)\/smaps/, "\\1", 1, f)
            file="/proc/"tgid"/comm"
            getline name < file
            close(file)
        }
        if ((/^Swap:/) && ($2>0)) {
            byteSize=$2*unit2exp[$3]
            if ( ! (tgid in procName)) {procName[tgid]=name}
            procSwap[tgid]+=byteSize
            totSwap+=byteSize
        }
    }'


exit $?



Au plaisir smile


Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

Pied de page des forums