#!/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")} } }'