logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

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 19:26:37

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

[gawk] Processus Swapés

Hello,

Script mis à jour : Voir message #4 et # 5.

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 (29-12-2021 17:48:19)


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 20: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 21:12:38

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : 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 21: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 19:53:50

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : 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

Dernière modification par Tawal (29-12-2021 17:50:23)


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

#5 29-12-2021 17:43:40

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : [gawk] Processus Swapés

Amélioration du script :
    - ajout d'options et de l'aide.
    - Ré-exécution automatique du script avec des droits root si lancé en user.

#!/bin/bash
opt_l="OK"      # Par défaut, affichage complet.

usage() {
    echo
    echo -e "Usage :    \033[1m${0##*/} [OPTION]\033[0m"
    echo
    echo "Afficher la liste des processus utilisant le swap."
    echo
    echo "Options :"
    echo "    -b, --binaire    Utiliser des puissances de 1024 pour les tailles."
    echo "                     Les unités affichées sont kB, MB et GB."
    echo "                     Comportement par défaut."
    echo
    echo "    -d, --decimal    Utiliser des puissances de 1000 pour les tailles."
    echo "                     Les unités affichées sont ko, Mo et Go."
    echo
    echo "    -h, --help       Afficher cette aide et quitter."
    echo
    echo "    -o, --only-list  Afficher que la liste des processus (+ pid et taille)."
    echo "                     N'affiche pas la ligne d'entête, ni le nombre total de processus,"
    echo "                     ni le volume total occupé en Swap par les processus."
    echo
    echo "Affiche la taille occupée dans le swap par le processus et le PID."
    echo "Affiche la taille totale occupée par les processus et le nombre"
    echo "de processus utilisant le swap."
    printf "%72s\n" "Tawal®©"
    exit 0
}

err_opt() {
    echo -e "L'option \033[1m'$1'\033[0m n'est pas reconnue !" >&2
    exit 1
}

err_2many_opts() {
    echo -e "Les options '\033[1m-b\033[0m' et '\033[1m-d\033[0m' ne sont pas compatibles entre elles !" >&2
    exit 1
}

while getopts :hbdo-: option
do
    case "$option" in
        h) usage
           ;;
        b) [ "$opt" ] && err_2many_opts || opt="b"
           ;;
        d) [ "$opt" ] && err_2many_opts || opt="d"
           ;;
        o) opt_l=""
           ;;
        -) case $OPTARG in
                  help) usage
                        ;;
               binaire) [ "$opt" ] && err_2many_opts || opt="b"
                        ;;
               decimal) [ "$opt" ] && err_2many_opts || opt="d"
                        ;;
             only-list) opt_l=""
                        ;;
                     *) err_opt --$OPTARG
                        ;;
           esac
           ;;
        *) err_opt -$OPTARG
           ;;
    esac

done

if ! [ "$opt" ]
then
    opt="b"   # Par défaut afficher les tailles en puissances de 1024
fi

if [[ $UID != 0 ]]
then
    echo "Ré-exécution avec des droits root."
    sudo $0 $*
    exit $?
fi

tail -n +1 /proc/[0-9]*/smaps 2>/dev/null | gawk -v opt="$opt" -v l="$opt_l" '
    function b2h(mem,    x){
        m=mem
        while(int(m/=p))x++
        return x
    }
    BEGIN{
        if (opt == "d") {
            p=1000
            exp2unit[1]="ko"; exp2unit[2]="Mo"; exp2unit[3]="Go"
        }else{
            p=1024
            exp2unit[1]="kB"; exp2unit[2]="MB"; exp2unit[3]="GB"
        }
    }
    END{
        PROCINFO["sorted_in"]="@val_num_desc"
        if (totSwap>0) {
            if (l) {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/p^xp, exp2unit[xp])
                }
                else{
                    printf("%-18s %8d %8.1f %s\n", procName[pid], pid, sizeSwap/p^xp, exp2unit[xp])
                }
                nb++
            }
            if (l) {
                if (nb>1) {nt="nt"}
                print "\n"nb,"processus utilise"nt" le Swap"
                xp=b2h(totSwap)
                if(xp==1) {
                    printf("Volume occupé en Swap : %d %s\n\n",totSwap/p^xp, exp2unit[xp])
                }else{
                    printf("Volume occupé en Swap : %.1f %s\n\n",totSwap/p^xp, exp2unit[xp])
                }
            }
        }else{
            if (l) {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*1024
            if ( ! (tgid in procName)) {procName[tgid]=name}
            procSwap[tgid]+=byteSize
            totSwap+=byteSize
        }
    }'


Le rendu de l'aide :

Usage :    procswap [OPTION]

Afficher la liste des processus utilisant le swap.

Options :
    -b, --binaire    Utiliser des puissances de 1024 pour les tailles.
                     Les unités affichées sont kB, MB et GB.
                     Comportement par défaut.

    -d, --decimal    Utiliser des puissances de 1000 pour les tailles.
                     Les unités affichées sont ko, Mo et Go.

    -h, --help       Afficher cette aide et quitter.

    -o, --only-list  Afficher que la liste des processus (+ pid et taille).
                     N'affiche pas la ligne d'entête, ni le nombre total de processus,
                     ni le volume total occupé en Swap par les processus.

Affiche la taille occupée dans le swap par le processus et le PID.
Affiche la taille totale occupée par les processus et le nombre
de processus utilisant le swap.

Dernière modification par Tawal (29-12-2021 17:46:18)


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