====== Processus Swapés ======
* Afficher les processus utilisant le swap ainsi que leur PID et la taille utilisée en swap.
* Script directement fonctionnel (pas de modification nécessaire).
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 =====
#!/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