Table des matières

Processus Swapés

Ce script se relance tout seul en sudo. Votre mot de passe sera demandé.
Pour éviter cela, vous pouvez ajouter un fichier (sans extension) dans /etc/sudoers.d ayant ce contenu (à adapter à votre situation) :
Nom_Utilisateur Nom_Machine = NOPASSWD: /chemin/absolu/du/script/procswap


Nécessite gawk :
apt install gawk

L'aide

Processus Swapés - procswap
Usage :    procswap [OPTIONS]

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 +user +taille).
                     N'affiche pas l'entête, ni le nombre de processus,
                     ni le volume total occupé en Swap par les processus.
                                                                       Tawal®©

Le script

procswap
#!/bin/bash
 
### Couleurs et Formats Textes
Surb='\e[1m'
Rst='\e[m'
 
### Option par défaut.
opt_size="b"   # Par défaut afficher les tailles en puissances de 1024
 
### Fonctions
usage() {
    echo -e "Processus Swapés - ${Ital}${0##*/}${Rst}
Usage :    ${Surb}${0##*/} [OPTIONS]${Rst}
 
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 ${Surb}kB${Rst}, ${Surb}MB${Rst} et ${Surb}GB${Rst}.
                     Comportement par défaut.
 
    -d, --decimal    Utiliser des puissances de 1000 pour les tailles.
                     Les unités affichées sont ${Surb}ko${Rst}, ${Surb}Mo${Rst} et ${Surb}Go${Rst}.
 
    -h, --help       Afficher cette aide et quitter.
 
    -o, --only-list  Afficher que la liste des processus (+pid +user +taille).
                     N'affiche pas l'entête, ni le nombre de processus,
                     ni le volume total occupé en Swap par les processus."
    printf "%80s\n" "Tawal®©"
    exit 0
}
 
err_opt() {
    echo -e "L'option '${Surb}$1${Rst}' n'est pas reconnue !" >&2
    exit 1
}
 
err_2many_opts() {
    echo -e "Les options '${Surb}-b${Rst}' et '${Surb}-d${Rst}' ne sont pas compatibles entre elles !" >&2
    exit 1
}
 
 
### Gestion Options
while getopts :hbdo-: option
do
    case "$option" in
        h) usage
           ;;
        b) opt_b="ON"
           [ "$opt_d" ] && err_2many_opts || opt_size="b"
           ;;
        d) opt_d="ON"
           [ "$opt_b" ] && err_2many_opts || opt_size="d"
           ;;
        o) opt_o="ON"
           ;;
        -) case $OPTARG in
                  help) usage
                        ;;
               binaire) [ "$opt" ] && err_2many_opts || opt_size="b"
                        ;;
               decimal) [ "$opt" ] && err_2many_opts || opt_size="d"
                        ;;
             only-list) opt_o="ON"
                        ;;
                     *) err_opt --"$OPTARG"
                        ;;
           esac
           ;;
        *) err_opt -"$OPTARG"
           ;;
    esac
 
done
 
 
### Ré-exécution avec droits root si lancé en user
if [[ $UID != 0 ]]
then
    sudo "$0" "$@"
    exit $?
fi
 
 
### Corps du Programme
tail -n +1 /proc/[0-9]*/smaps 2>/dev/null | gawk -v opt="$opt_size" -v o="$opt_o" '
    function b2h(mem,p,    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"
        }
    }
 
    {
        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
        }
    }
 
    END{
        PROCINFO["sorted_in"]="@val_num_desc"
        if (totSwap>0) {
            if (!o) {printf("%-18s %7s %12s\n\n", "NOM", "PID", "TAILLE")}
            for(pid in procSwap){
                sizeSwap=procSwap[pid]
                xp=b2h(sizeSwap,p)
                if(xp==1){prec="d"}else{prec=".1f"}
                printf("%-18s %8d %8"prec" %s\n", procName[pid], pid, sizeSwap/p^xp, exp2unit[xp])
                nb++
            }
            if (!o) {
                if (nb>1) {nt="nt"}
                print "\n"nb,"processus utilise"nt" le Swap"
                xp=b2h(totSwap,p)
                if(xp==1) { prec="d"}else{prec=".1f"}
                printf("Volume occupé en Swap : %"prec" %s\n\n",totSwap/p^xp, exp2unit[xp])
            }
        }else{
            if (!o) {printf("Aucun processus en swap.\n")}
        }
    }'

Exemple de retour

procswap
NOM                    PID       TAILLE

conky                  2231      1.3 MB
conky                  2215      1.0 MB
ssh-agent              1977      372 kB
gnome-keyring-d        2000      236 kB

4 processus utilisent le Swap
Volume occupé en Swap : 2.9 MB