Pages : 1
#1 Le 20/04/2021, à 12:15
- Tawal
Processus Swapés - script
Hello,
En suivant les conseils avisés de Watael ,
je reprends ici le sujet de mon post dans [Vos Scripts Utiles] ... mon post
Il est donc question d'un petit script affichant les processus swapés ainsi que leurs pids et volumes occupés respectifs.
En dernier lieu, Watael m'avait suggéré ceci :
PS: le tri se fait alors sur la valeur du tableau, plus sur l'indice.
PS2 : j'essaie de faire des tests, mais ma machine ne swap pas.$ awk 'BEGIN{PROCINFO["sorted_in"]="@val_num_desc"; units["kB"]=1024; units["mB"]=1024**2; units[gB]=1024**3}/^Name/{name=$2}; /^Tgid/{tgid=$2}; /^VmSwap/{byteSize=$2*units[3]; procName[tgid]=name; procSwap[tgid]=byteSize}END{for(i in procSwap)print procName[i],bytes2human(procSwap[i]) }' /proc/*/status
il faut encore créer la fonction bytes2human() pour rendre le nombre d'octets lisible par un humain
Est-il besoin de rappeler que je suis bien novice concernant awk (et même bash ) ?
Mais voici ce que j'ai fait (encore à la barbare ...) : Voici ce que Watael a proposé :
#!/bin/bash
cat /proc/[0-9]*/status 2>/dev/null | gawk '
function b2h(mem, x){
m=mem
while(int(m/=ko))x++
return x
}
BEGIN{
ko=1000
unit2exp["kB"]=ko**1; unit2exp["mB"]=ko**2; unit2exp["gB"]=ko**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")
}
}
/^Name:/{
name=$2
}
/^Tgid:/{
tgid=$2
}
/^VmSwap:/ && $2>0 {
byteSize=$2*unit2exp[$3]; procName[tgid]=name; procSwap[tgid]=byteSize; totSwap+=byteSize
}'
exit $?
C'est fonctionnel, même si je pressens que c'est pas optimum. (maintenant ça l'est)
J'ai fait fait "swaper" ma machine en démarrant une VM pour avoir un retour parlant :
$ procswap
NOM PID TAILLE
lightdm 925 172 ko
evolution-alarm 1674 132 ko
at-spi-bus-laun 3365 132 ko
NetworkManager 790 112 ko
needrestart-dbu 2018 108 ko
polkitd 902 96 ko
lightdm 1437 92 ko
dconf-service 2126 80 ko
xfce4-session 1495 76 ko
gsd-disk-utilit 1624 72 ko
cups-browsed 892 56 ko
package-update- 1894 56 ko
udisksd 787 40 ko
Thunar 1579 40 ko
gnome-keyring-d 1567 32 ko
evolution-addre 2133 32 ko
accounts-daemon 784 28 ko
xfsettingsd 1575 28 ko
rsyslogd 791 24 ko
Xorg 937 24 ko
xfce4-power-man 1685 24 ko
avahi-daemon 785 16 ko
xfconfd 1499 16 ko
xfwm4 1572 16 ko
upowerd 1582 12 ko
devilspie 1628 12 ko
applet.py 1832 12 ko
nm-applet 1885 12 ko
gvfsd 1585 8 ko
xfce4-notifyd 1684 8 ko
polkit-gnome-au 1869 8 ko
dbus-daemon 786 4 ko
smartd 799 4 ko
systemd-logind 803 4 ko
gvfs-gphoto2-vo 2002 4 ko
Volume occupé en Swap : 1.6 Mo
$
Tout conseils, critiques, suggestions ou autres sont les bienvenus
Merci à vous.
Edit:
Ajout de la redirection des erreurs d'awk
Ajout de l'exit $?
(oublis de ma part)
Edit2:
Amélioration du glob de recherche d'awk. Merci pour ton lien bruno
(/proc/*/status ---> /proc/[0-9]*/status)
Edit3:
Changement awk par gawk (ne fonctionne pas [sur le tri] sans gawk)
Edit4: Correction erreur (redirection). Merci geole
Edit5: Mise à jour du script (revu et corrigé par Watael)
Edit6: Re-mise à jour du script (mise en forme du retour + Mise en place de "cat /proc/[0-9]*/status 2 >/dev/null | gawk '....'" afin d'éviter l'arrêt de traitement par gawk si un fichier /proc/xxxx/status disparaît entre l'expansion et le traitement de celui-ci (arrêt du processus associé)
Dernière modification par Tawal (Le 06/10/2021, à 11:39)
Le savoir n'a d’intérêt que si on le transmet.
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 Le 20/04/2021, à 12:58
- bruno
Re : Processus Swapés - script
À comparer avec :
https://sleeplessbeastie.eu/2016/12/26/ … wap-space/
Il y a aussi la commande smem (paquet du même nom).
Dernière modification par bruno (Le 20/04/2021, à 12:59)
#3 Le 20/04/2021, à 13:22
- geole
Re : Processus Swapés - script
Bonjour
Voici un autre retour
PROCESSUS PID SWAPED
gvfs-gphoto2-vo 1574 614 Ko
gvfsd-fuse 1292 913 Ko
kerneloops 766 61 Ko
Xorg 1276 6,5 Mo
cupsd 676 147 Ko
gvfs-afc-volume 1556 655 Ko
at-spi-bus-laun 1450 552 Ko
polkitd 560 380 Ko
fwupd 7223 299 Ko
cups-browsed 699 204 Ko
mount.ntfs 1351 20 Ko
goa-daemon 1537 6,2 Mo
tracker-miner-f 1257 6,2 Mo
gdm-x-session 1272 536 Ko
rpc.mountd 715 5,3 Mo
rtkit-daemon 1262 8 Ko
freshclam 758 167 Ko
cron 492 4 Ko
systemd-timesyn 405 57 Ko
accounts-daemon 468 307 Ko
gnome-shell 1519 14,3 Mo
mount.ntfs 1198 16 Ko
udisksd 580 569 Ko
colord 1822 921 Ko
ModemManager 693 225 Ko
gdm-session-wor 1238 323 Ko
dbus-daemon 509 212 Ko
rpcbind 398 8 Ko
gvfs-goa-volume 1531 442 Ko
systemd 1245 1,1 Mo
goa-identity-se 1550 1,1 Mo
NetworkManager 516 421 Ko
gnome-keyring-d 1264 544 Ko
mount.ntfs 1223 8 Ko
switcheroo-cont 573 36 Ko
unattended-upgr 714 1,6 Mo
mount.ntfs 1210 12 Ko
mount.ntfs 1078 12 Ko
upowerd 1578 167 Ko
(sd-pam) 1246 638 Ko
dbus-daemon 1455 258 Ko
pulseaudio 1255 2,1 Mo
systemd-logind 576 36 Ko
mount.ntfs 1199 8 Ko
mount.ntfs 1323 16 Ko
avahi-daemon 602 24 Ko
wpa_supplicant 581 32 Ko
dbus-daemon 1260 208 Ko
systemd-resolve 403 729 Ko
mount.ntfs 1341 49 Ko
gvfs-udisks2-vo 1293 1,1 Mo
systemd-udevd 347 811 Ko
gvfs-mtp-volume 1562 421 Ko
gvfsd 1277 507 Ko
gnome-session-c 1498 483 Ko
snapd 572 1,7 Mo
gnome-session-b 1506 1,4 Mo
irqbalance 552 8 Ko
gdm3 1233 667 Ko
mount.ntfs 1218 20 Ko
smartd 571 212 Ko
networkd-dispat 555 1,6 Mo
rsyslogd 567 184 Ko
Total en Swap : 64,7 Mo
Peut-être ajouter un tri sur le 4eme paramètre puis le 3eme
A comparer à ce retour
find /proc -maxdepth 2 -path "/proc/[0-9]*/status" -readable -exec awk -v FS=":" '{process[$1]=$2;sub(/^[ \t]+/,"",process[$1]);} END {if(process["VmSwap"] && process["VmSwap"] != "0 kB") printf "%10s %-30s %20s\n",process["Pid"],process["Name"],process["VmSwap"]}' '{}' \;
347 systemd-udevd 792 kB
398 rpcbind 8 kB
403 systemd-resolve 712 kB
405 systemd-timesyn 56 kB
468 accounts-daemon 300 kB
492 cron 4 kB
509 dbus-daemon 208 kB
516 NetworkManager 412 kB
552 irqbalance 8 kB
555 networkd-dispat 1572 kB
560 polkitd 372 kB
567 rsyslogd 180 kB
571 smartd 208 kB
572 snapd 1696 kB
573 switcheroo-cont 36 kB
576 systemd-logind 36 kB
580 udisksd 556 kB
581 wpa_supplicant 32 kB
602 avahi-daemon 24 kB
676 cupsd 144 kB
693 ModemManager 220 kB
699 cups-browsed 200 kB
714 unattended-upgr 1572 kB
715 rpc.mountd 5216 kB
758 freshclam 164 kB
766 kerneloops 60 kB
1078 mount.ntfs 12 kB
1198 mount.ntfs 16 kB
1199 mount.ntfs 8 kB
1210 mount.ntfs 12 kB
1218 mount.ntfs 20 kB
1223 mount.ntfs 8 kB
1233 gdm3 652 kB
1238 gdm-session-wor 316 kB
1245 systemd 1116 kB
1246 (sd-pam) 624 kB
1255 pulseaudio 2036 kB
1257 tracker-miner-f 6092 kB
1260 dbus-daemon 204 kB
1262 rtkit-daemon 8 kB
1264 gnome-keyring-d 532 kB
1272 gdm-x-session 524 kB
1276 Xorg 6300 kB
1277 gvfsd 496 kB
1292 gvfsd-fuse 892 kB
1293 gvfs-udisks2-vo 1112 kB
1323 mount.ntfs 16 kB
1341 mount.ntfs 48 kB
1351 mount.ntfs 20 kB
1450 at-spi-bus-laun 540 kB
1455 dbus-daemon 252 kB
1498 gnome-session-c 472 kB
1506 gnome-session-b 1412 kB
1519 gnome-shell 14012 kB
1531 gvfs-goa-volume 432 kB
1537 goa-daemon 6076 kB
1550 goa-identity-se 1100 kB
1556 gvfs-afc-volume 640 kB
1562 gvfs-mtp-volume 412 kB
1574 gvfs-gphoto2-vo 600 kB
1578 upowerd 164 kB
1822 colord 900 kB
7223 fwupd 292 kB
Dernière modification par geole (Le 20/04/2021, à 13:28)
Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit, utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248
En ligne
#4 Le 20/04/2021, à 13:28
- Tawal
Re : Processus Swapés - script
Très intéressant bruno
L'usage d'awk est assez similaire mais en bien plus concis (efficace) ! Je vais m'en inspirer. Merci
Par contre, un simple test avec time sur le 1er exemple de ton lien (donc sans tri, ni conversion d'unité) est assez probant pour ma "watael-mouture" :
$ time find /proc -maxdepth 2 -path "/proc/[0-9]*/status" -readable -exec awk -v FS=":" '{process[$1]=$2;sub(/^[ \t]+/,"",process[$1]);} END {if(process["VmSwap"] && process["VmSwap"] != "0 kB") printf "%10s %-30s %20s\n",process["Pid"],process["Name"],process["VmSwap"]}' '{}' \;
....
real 0m2,366s
user 0m0,846s
sys 0m1,258s
$
$ time procswap
...
real 0m0,074s
user 0m0,041s
sys 0m0,029s
$
Pour le paquet smem, je ne le connaissais pas, je vais voir ça
Edit: en fait, les 2 méthodes diffèrent sur le principe :
- avec find, awk est lancé à chaque fichier trouvé par find --> un awk ne s'appliquant qu'au flux de ce fichier. (réinitialisé à chaque fichier)
-avec awk seul, les instructions s'appliquent sur le flux de tous les fichiers trouvés par le glob.
Rajout au script de la redirection des erreurs d'awk et rajout de l'exit $? (oubli de ma part)
Dernière modification par Tawal (Le 20/04/2021, à 13:49)
Le savoir n'a d’intérêt que si on le transmet.
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 Le 20/04/2021, à 13:55
- Tawal
Re : Processus Swapés - script
@geole:
Ton retour de mon script n'est pas trié car awk utilise ici des spécificités à gawk.
Si tu installes gawk, le retour sera trié
Le savoir n'a d’intérêt que si on le transmet.
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
#6 Le 20/04/2021, à 15:28
- Tawal
Re : Processus Swapés - script
@bruno:
Pour le paquet smem, c'est raté du coté swap :
Description
smem reports physical memory usage, taking shared memory pages into account. Unshared memory is reported as the USS (Unique Set Size). Shared memory is divided evenly among the processes sharing that memory. The unshared memory (USS) plus a process's proportion of shared memory is reported as the PSS (Proportional Set Size). The USS and PSS only include physical memory usage. They do not include memory that has been swapped out to disk.
Donc mon script a toute sa raison d'être
Le savoir n'a d’intérêt que si on le transmet.
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
#7 Le 20/04/2021, à 15:38
- bruno
Re : Processus Swapés - script
Cela ne veut pas dire que smem n'affiche pas la partie en swap et d'ailleurs il le fait :
smem command -c "pid command swap" --sort=swap -r
#8 Le 20/04/2021, à 16:53
- geole
Re : Processus Swapés - script
Un retour
PROCESSUS PID SWAPED
gnome-shell 1519 92.9 Mo
evolution-alarm 1794 16.3 Mo
rpc.mountd 715 14.1 Mo
ibus-extension- 1613 13.7 Mo
smart-notifier 1777 10.8 Mo
gsd-keyboard 1712 10.1 Mo
Xorg 1276 9.9 Mo
ibus-x11 1617 9.9 Mo
gsd-wacom 1750 9.5 Mo
gsd-power 1724 9.1 Mo
gsd-color 1709 8.4 Mo
gsd-media-keys 1716 8.0 Mo
gsd-xsettings 1755 6.1 Mo
tracker-miner-f 1257 6.1 Mo
goa-daemon 1537 5.8 Mo
snapd 572 5.1 Mo
gjs 1693 5.0 Mo
networkd-dispat 555 4.4 Mo
unattended-upgr 714 4.3 Mo
evolution-calen 1653 3.8 Mo
gnome-shell-cal 1638 3.6 Mo
evolution-addre 1665 3.3 Mo
evolution-sourc 1644 2.8 Mo
xbindkeys 1852 2.7 Mo
colord 1822 2.6 Mo
systemd-udevd 347 2.3 Mo
systemd-resolve 403 2.2 Mo
pulseaudio 1255 2.1 Mo
gsd-printer 1821 2.1 Mo
gsd-datetime 1710 1.7 Mo
gnome-session-b 1356 1.7 Mo
gdm3 1233 1.7 Mo
snap-store 1867 1.7 Mo
gnome-session-b 1506 1.5 Mo
ibus-daemon 1608 1.5 Mo
udisksd 580 1.4 Mo
NetworkManager 516 1.2 Mo
systemd 1245 1.2 Mo
gdm-session-wor 1238 1.2 Mo
gvfs-udisks2-vo 1293 1.1 Mo
goa-identity-se 1550 1.1 Mo
gsd-disk-utilit 1761 1.1 Mo
systemd-journal 282 1.1 Mo
gvfsd-trash 1694 974 Ko
gvfsd-fuse 1292 933 Ko
accounts-daemon 468 929 Ko
gsd-print-notif 1725 913 Ko
freshclam 758 868 Ko
ibus-engine-sim 1776 827 Ko
gsd-sharing 1730 811 Ko
gsd-sound 1741 811 Ko
ibus-memconf 1612 778 Ko
gnome-keyring-d 1264 724 Ko
ModemManager 693 720 Ko
gdm-x-session 1272 712 Ko
cups-browsed 699 708 Ko
smartd 571 684 Ko
gsd-smartcard 1738 679 Ko
(sd-pam) 1246 659 Ko
gvfs-afc-volume 1556 655 Ko
xdg-permission- 1633 647 Ko
gsd-wwan 1754 643 Ko
gvfs-gphoto2-vo 1574 610 Ko
at-spi-bus-laun 1450 548 Ko
upowerd 1578 548 Ko
gvfsd 1277 520 Ko
rsyslogd 567 495 Ko
cupsd 676 495 Ko
gnome-session-c 1498 479 Ko
at-spi2-registr 1629 458 Ko
dbus-daemon 509 446 Ko
gsd-usb-protect 1745 446 Ko
gvfs-goa-volume 1531 442 Ko
polkitd 560 438 Ko
ssh-agent 1425 430 Ko
ibus-portal 1620 430 Ko
gvfs-mtp-volume 1562 417 Ko
gsd-housekeepin 1711 401 Ko
gsd-a11y-settin 1706 360 Ko
gsd-rfkill 1726 360 Ko
xdg-document-po 1887 339 Ko
kerneloops 766 286 Ko
systemd-logind 576 274 Ko
dbus-daemon 1455 270 Ko
systemd-timesyn 405 266 Ko
gsd-screensaver 1727 258 Ko
dbus-daemon 1260 241 Ko
dconf-service 1662 225 Ko
mount.ntfs 1341 204 Ko
wpa_supplicant 581 163 Ko
switcheroo-cont 573 159 Ko
avahi-daemon 602 90 Ko
mount.ntfs 1323 90 Ko
rpcbind 398 73 Ko
mount.ntfs 1218 65 Ko
mount.ntfs 1351 61 Ko
mount.ntfs 1198 57 Ko
mount.ntfs 1078 53 Ko
mount.ntfs 1199 53 Ko
mount.ntfs 1210 53 Ko
mount.ntfs 1223 53 Ko
systemd 1 36 Ko
irqbalance 552 36 Ko
avahi-daemon 489 32 Ko
cron 492 28 Ko
rtkit-daemon 1262 28 Ko
blkmapd 311 16 Ko
rpc.idmapd 395 12 Ko
acpid 470 4 Ko
Total en Swap : 322.9 Mo
Dernière modification par geole (Le 21/04/2021, à 09:00)
Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit, utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248
En ligne
#9 Le 20/04/2021, à 18:58
- Tawal
Re : Processus Swapés - script
Merci geole, c'est corrigé
@bruno
On n'a pas du tout le même retour :
$ smem command -c "pid command swap" --sort=swap -r
PID Command Swap
1971 /usr/lib/evolution/evolutio 28
3365 /usr/lib/at-spi2-core/at-sp 24
1585 /usr/lib/gvfs/gvfsd 24
1684 /usr/lib/x86_64-linux-gnu/x 8
9065 /usr/bin/python /usr/bin/sm 0
8871 bash 0
7224 /usr/lib/virtualbox/VBoxSVC 0
7218 /usr/lib/virtualbox/VBoxXPC 0
7184 /usr/lib/virtualbox/Virtual 0
4911 bash 0
4907 xfce4-terminal 0
3754 /usr/lib/firefox-esr/firefo 0
3629 /usr/lib/firefox-esr/firefo 0
3609 /usr/lib/firefox-esr/firefo 0
....
$ procswap
PROCESSUS PID SWAPED
dbus-daemon 786 94 Ko
packagekitd 5926 45 Ko
evolution-sourc 1971 28 Ko
gvfsd 1585 24 Ko
at-spi-bus-laun 3365 24 Ko
unattended-upgr 914 16 Ko
xfce4-notifyd 1684 8 Ko
(sd-pam) 1444 4 Ko
Total en Swap : 245 Ko
Je ne sais quoi en penser étant donné que je connais pas smem.
Edit:
Je pense que smem ne regarde pas toutes les parties de mémoire en swap.
Ce que je souligne au #6
Du coup, certains processus sont invisibles pour smem et certains processus ne comptent pas toute leur occupation du swap.
Un autre retour (je supprime les retour à 0 du swap de smem) :
$ time smem command -c "pid command swap" --sort=swap -r | awk '$NF!=0 {print $0}'
PID Command Swap
1971 /usr/lib/evolution/evolutio 564
3365 /usr/lib/at-spi2-core/at-sp 560
1585 /usr/lib/gvfs/gvfsd 432
1684 /usr/lib/x86_64-linux-gnu/x 92
real 0m3,066s
user 0m2,726s
sys 0m0,315s
$ time procswap
PROCESSUS PID SWAPED
Xorg 937 970 Ko
lightdm 925 860 Ko
evolution-sourc 1971 577 Ko
at-spi-bus-laun 3365 573 Ko
gvfsd 1585 442 Ko
dbus-daemon 786 282 Ko
unattended-upgr 914 274 Ko
NetworkManager 790 143 Ko
xfce4-notifyd 1684 98 Ko
(sd-pam) 1444 40 Ko
upowerd 1582 36 Ko
alsactl 794 16 Ko
cups-browsed 892 16 Ko
accounts-daemon 784 12 Ko
cupsd 801 12 Ko
systemd-timesyn 751 8 Ko
udisksd 787 8 Ko
Total en Swap : 4.4 Mo
real 0m0,049s
user 0m0,024s
sys 0m0,012s
$
Dernière modification par Tawal (Le 20/04/2021, à 19:14)
Le savoir n'a d’intérêt que si on le transmet.
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
#10 Le 21/04/2021, à 00:55
- Watael
Re : Processus Swapés - script
il ne s'agit pas de Ko (1024 octets) mais de kB (1000 octets).
#!/usr/bin/awk -f
function b2h(mem, x){
m=mem
while(int(m/=kb))x++
return x
}
BEGIN{
kb=1000; Ko=1024
unit2exp["kB"]=kb**1; unit2exp["mB"]=kb**2; unit2exp["gB"]=kb**3
exp2unit[1]="kB"; exp2unit[2]="mB"; exp2unit[3]="gB"
}
END{
PROCINFO["sorted_in"]="@val_num_desc";
printf("\n%-20s %-8s %-8s\n\n", "NAME", "PID", "SIZE")
# for(pid in procSize){
# size=procSize[pid]
for(pid in procSwap){
size=procSwap[pid]
xp=b2h(size)
printf("%-20s %-8d %.1f %s\n", procName[pid], pid, size/kb^xp, exp2unit[xp])
}
xp=b2h(totSize)
printf("\ntotal Size: %.1f %s\n\n",totSize/kb^xp, exp2unit[xp])
}
/^Name:/{
name=$2
}
/^Tgid:/{
tgid=$2
}
#/^VmSize:/{
# byteSize=$2*unit2exp[$3]; procName[tgid]=name; procSize[tgid]=byteSize; totSize+=byteSize
#}
/^VmSwap:/ && $2>0 {
byteSize=$2*unit2exp[$3]; procName[tgid]=name; procSwap[tgid]=byteSize; totSwap+=byteSize
}
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 21/04/2021, à 12:03
- Tawal
Re : Processus Swapés - script
Pour les unités, il me semblait bien (mais j'ai préféré vérifier) que 1ko = 1kB = 1000 octets.
Par contre 1kio = 1kiB = 1024 octets.
Dans le S.I. le symbole k vaut toujours 10^3 quelle que soit l'unité à la laquelle il s'applique.
Mais il y a encore beaucoup de confusion et de mauvaises utilisations (même des constructeurs).
source
Ça n'empêche pas que j'ai fait l'erreur de multiplier par 1024 au lieu de 1000
Pour le script awk, whaouu ! quelle logique !
Et tu me montres carrément ce que tu voulais que je comprenne ici
Tu t'assures de convertir correctement la valeur swapée selon son unité dans le fichier status.
Même si l'unité sera toujours kB (je crois) dans le fichier status. Je n'en ai jamais vu d'autres mais je n'ai pas de source pour le confirmer.
En tout cas, ce que tu me montres est pour moi une mine d'informations, de syntaxes et de concepts. MERCI
Je garde la justification à droite pour les PID et la valeur Swapée et son Unité .
Je garde aussi la valeur sans virgule pour les unités kB.
PS : Il y a quelques erreurs (d'étourderie je pense) : il manque une } fermante dans la boucle for commentée et tu affiches totSize à la place de totSwap mais bon, beau travail !
Dernière modification par Tawal (Le 21/04/2021, à 12:27)
Le savoir n'a d’intérêt que si on le transmet.
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
#12 Le 21/04/2021, à 12:25
- Watael
Re : Processus Swapés - script
je n'ai commenté que les deux premières lignes de la boucle, le reste étant identique.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 21/04/2021, à 13:32
- Tawal
Re : Processus Swapés - script
Une autre question :
Tu as mis un shebang pointant vers /usr/bin/awk.
Pour en faire un commande simple (du genre procswap), vaut-il mieux utiliser un alias ? :
alias procswap='script-awk /proc/[0-9]*/status 2>/dev/null'
En ayant donné les droits d'exécution et placé le script-awk dans un dossier du PATH.
Ou vaut-il mieux utiliser le shebang #!/bin/bash et mettre la commande gwak entière (avec redirection) ?
Je me permets de donner mon avis :
Vu que ce script awk ne peut s'appliquer qu'à un seul cas, il n'est pas nécessaire de l'avoir en script extérieur.
En te remerciant.
Le savoir n'a d’intérêt que si on le transmet.
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
#14 Le 21/04/2021, à 16:37
- Watael
Re : Processus Swapés - script
je vote pour l'alias. intuitivement.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#15 Le 21/04/2021, à 16:55
- geole
Re : Processus Swapés - script
Juste une question.
On parle d'un petit script.
Pour l'exécuter, je fais de cette façon.
1) Copie du script dans le forum.
2) Ouverture d'un terminal en frappant Crtl Alt t
3) Coller
4) Je constate alors que le terminal se ferme automatiquement sans que je puisse voir quoique ce soit!
Pour résoudre le problème, je dois faire très attention à ne pas sélectionner la première ligne et surtout la dernière!
J'ai nommé
#!/bin/bash
exit $?
Dernière modification par geole (Le 21/04/2021, à 16:56)
Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit, utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248
En ligne
#16 Le 21/04/2021, à 16:58
- Tawal
Re : Processus Swapés - script
Ok merci.
Je mets ça en place
Voici ce que j'ai fait (ou plutôt ce que j'en ai fait ...)
#!/usr/bin/awk -f
function b2h(mem, x){
m=mem
while(int(m/=ko))x++
return x
}
BEGIN{
ko=1000
unit2exp["kB"]=ko**1; unit2exp["mB"]=ko**2; unit2exp["gB"]=ko**3
exp2unit[1]="ko"; exp2unit[2]="Mo"; exp2unit[3]="Go"
}
END{
PROCINFO["sorted_in"]="@val_num_desc";
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/ko^xp, exp2unit[xp])
}
else{
printf("%-18s %5d %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])
}
}
/^Name:/{
name=$2
}
/^Tgid:/{
tgid=$2
}
/^VmSwap:/ && $2>0 {
byteSize=$2*unit2exp[$3]; procName[tgid]=name; procSwap[tgid]=byteSize; totSwap+=byteSize
}
J'ai juste changé la mise en forme et enlevé la virgule pour les unités en ko.
Et j'ai changé les "kB, mB et gB" en "ko, Mo et Go" juste pour t'embêter
Non, franchement merci de ce gros coup de main (t'as tout fait !).
Le savoir n'a d’intérêt que si on le transmet.
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
#17 Le 21/04/2021, à 17:01
- geole
Re : Processus Swapés - script
Cela commence mal......
a@b:~$ #!/usr/bin/awk -f
a@b:~$
a@b:~$ function b2h(mem, x){
bash: erreur de syntaxe près du symbole inattendu « mem, »
a@b:~$ m=mem
a@b:~$ while(int(m/=ko))x++
bash: erreur de syntaxe près du symbole inattendu « m/=ko »
a@b:~$ return x
bash: return: x : argument numérique nécessaire
bash: return: « return » n'est possible que depuis une fonction ou depuis un script exécuté par « source »
a@b:~$ }
bash: erreur de syntaxe près du symbole inattendu « } »
a@b:~$ BEGIN{
BEGIN{ : commande introuvable
a@b:~$ ko=1000
a@b:~$ unit2exp["kB"]=ko**1; unit2exp["mB"]=ko**2; unit2exp["gB"]=ko**3
a@b:~$ exp2unit[1]="ko"; exp2unit[2]="Mo"; exp2unit[3]="Go"
a@b:~$ }
bash: erreur de syntaxe près du symbole inattendu « } »
a@b:~$ END{
END{ : commande introuvable
a@b:~$ PROCINFO["sorted_in"]="@val_num_desc";
a@b:~$ printf("%-18s %5s %11s\n\n", "NOM", "PID", "TAILLE")
bash: erreur de syntaxe près du symbole inattendu « "%-18s %5s %11s\n\n", »
a@b:~$ for(pid in procSwap){
bash: erreur de syntaxe près du symbole inattendu « ( »
a@b:~$ sizeSwap=procSwap[pid]
a@b:~$ xp=b2h(sizeSwap)
bash: erreur de syntaxe près du symbole inattendu « ( »
a@b:~$ if(xp==1){
bash: erreur de syntaxe près du symbole inattendu « { »
a@b:~$ printf("%-18s %5d %8d %s\n", procName[pid], pid, sizeSwap/ko^xp, exp2unit[xp])
bash: erreur de syntaxe près du symbole inattendu « "%-18s %5d %8d %s\n", »
a@b:~$ }
bash: erreur de syntaxe près du symbole inattendu « } »
a@b:~$ else{
else{ : commande introuvable
a@b:~$ printf("%-18s %5d %8.1f %s\n", procName[pid], pid, sizeSwap/ko^xp, exp2unit[xp])
bash: erreur de syntaxe près du symbole inattendu « "%-18s %5d %8.1f %s\n", »
a@b:~$ }
bash: erreur de syntaxe près du symbole inattendu « } »
a@b:~$ }
bash: erreur de syntaxe près du symbole inattendu « } »
a@b:~$ xp=b2h(totSwap)
bash: erreur de syntaxe près du symbole inattendu « ( »
a@b:~$ if(xp==1){
bash: erreur de syntaxe près du symbole inattendu « { »
a@b:~$ printf("\nVolume occupé en Swap : %d %s\n\n",totSwap/ko^xp, exp2unit[xp])
bash: erreur de syntaxe près du symbole inattendu « "\nVolume occupé en Swap : %d %s\n\n",totSwap/ko^xp, »
a@b:~$ }
bash: erreur de syntaxe près du symbole inattendu « } »
a@b:~$ else{
else{ : commande introuvable
a@b:~$ printf("\nVolume occupé en Swap : %.1f %s\n\n",totSwap/ko^xp, exp2unit[xp])
bash: erreur de syntaxe près du symbole inattendu « "\nVolume occupé en Swap : %.1f %s\n\n",totSwap/ko^xp, »
a@b:~$ }
bash: erreur de syntaxe près du symbole inattendu « } »
a@b:~$ }
bash: erreur de syntaxe près du symbole inattendu « } »
a@b:~$ /^Name:/{
bash: /^Name:/{: Aucun fichier ou dossier de ce type
a@b:~$ name=$2
a@b:~$ }
bash: erreur de syntaxe près du symbole inattendu « } »
a@b:~$ /^Tgid:/{
bash: /^Tgid:/{: Aucun fichier ou dossier de ce type
a@b:~$ tgid=$2
a@b:~$ }
bash: erreur de syntaxe près du symbole inattendu « } »
a@b:~$ /^VmSwap:/ && $2>0 {
bash: /^VmSwap:/: Aucun fichier ou dossier de ce type
a@b:~$ byteSize=$2*unit2exp[$3]; procName[tgid]=name; procSwap[tgid]=byteSize; totSwap+=byteSize
a@b:~$ }
Dernière modification par geole (Le 21/04/2021, à 17:58)
Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit, utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248
En ligne
#18 Le 21/04/2021, à 17:07
- Tawal
Re : Processus Swapés - script
Non geole !
Il ne faut pas copier/coller un script dans un terminal !
Copie le script dans un fichier texte (que tu nommes comme tu veux).
Donne les droits d'exécution à ce fichier. (chmod +x nom_du_fichier)
Et lance-le par cette commande dans un terminal :
awk -f nom_du_fichier /proc/[0-9]*/status 2>/dev/null
Sinon, tu peux aussi en faire un alias.
Le savoir n'a d’intérêt que si on le transmet.
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
#19 Le 21/04/2021, à 17:55
- geole
Re : Processus Swapés - script
Merci de ces précisions.
Mais je continue de ne pas savoir si cela représente 60% de la partition swap ou 6%!!
Il serait certainement possible d'ajouter le nombre de process
Voici le retour
NOM PID TAILLE
gnome-shell 1488 19.3 Mo
Xorg 1209 8.7 Mo
rpc.mountd 701 7.8 Mo
ibus-extension- 1532 7.5 Mo
tracker-miner-f 1190 6.5 Mo
goa-daemon 1353 5.5 Mo
evolution-sourc 1563 3.4 Mo
snapd 552 3.0 Mo
networkd-dispat 539 2.4 Mo
unattended-upgr 697 2.3 Mo
pulseaudio 1188 2.0 Mo
ibus-x11 1536 1.7 Mo
gnome-session-b 1280 1.7 Mo
freshclam 6373 1.6 Mo
gnome-shell-cal 1557 1.4 Mo
gnome-session-b 1468 1.3 Mo
gvfs-udisks2-vo 1243 1.2 Mo
colord 1747 1.1 Mo
systemd-udevd 348 1.1 Mo
systemd-resolve 396 1.0 Mo
gdm3 1170 880 ko
systemd 1182 804 ko
goa-identity-se 1384 796 ko
udisksd 566 684 ko
gvfs-afc-volume 1395 680 ko
NetworkManager 483 640 ko
(sd-pam) 1183 608 ko
gvfsd-fuse 1241 596 ko
gnome-keyring-d 1202 568 ko
gvfs-gphoto2-vo 1412 548 ko
ibus-daemon 1527 528 ko
gvfsd 1220 484 ko
at-spi-bus-laun 1408 472 ko
gdm-x-session 1207 468 ko
gnome-session-c 1461 468 ko
at-spi2-registr 1548 468 ko
ibus-memconf 1531 432 ko
ssh-agent 1361 424 ko
ibus-portal 1539 400 ko
gvfs-goa-volume 1345 368 ko
polkitd 542 360 ko
accounts-daemon 455 352 ko
ModemManager 681 352 ko
gvfs-mtp-volume 1403 344 ko
cups-browsed 692 316 ko
smartd 551 304 ko
xdg-permission- 1552 292 ko
gvfsd-metadata 1521 268 ko
upowerd 1420 240 ko
rsyslogd 547 228 ko
cupsd 618 228 ko
dbus-daemon 480 220 ko
dbus-daemon 1414 216 ko
dbus-daemon 1193 200 ko
kerneloops 770 92 ko
systemd-timesyn 399 88 ko
systemd-logind 560 68 ko
switcheroo-cont 556 60 ko
wpa_supplicant 572 52 ko
mount.ntfs 1200 52 ko
avahi-daemon 590 40 ko
mount.ntfs 1109 24 ko
gdm-session-wor 1176 24 ko
mount.ntfs 1129 20 ko
mount.ntfs 1162 20 ko
mount.ntfs 1212 20 ko
rpcbind 393 16 ko
mount.ntfs 956 16 ko
mount.ntfs 1128 16 ko
mount.ntfs 1131 16 ko
mount.ntfs 1147 16 ko
systemd 1 12 ko
avahi-daemon 473 8 ko
cron 477 4 ko
irqbalance 531 4 ko
Volume occupé en Swap : 96.4 Mo
Voici ce que tu pourrais proposer en copier/coller
touch test.sh
chmod +x test.sh
cat > test.sh<<"EXECUTE"
#!/usr/bin/awk -f
function b2h(mem, x){
m=mem
while(int(m/=ko))x++
return x
}
BEGIN{
ko=1000
unit2exp["kB"]=ko**1; unit2exp["mB"]=ko**2; unit2exp["gB"]=ko**3
exp2unit[1]="ko"; exp2unit[2]="Mo"; exp2unit[3]="Go"
}
END{
PROCINFO["sorted_in"]="@val_num_desc";
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/ko^xp, exp2unit[xp])
}
else{
printf("%-18s %5d %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])
}
}
/^Name:/{
name=$2
}
/^Tgid:/{
tgid=$2
}
/^VmSwap:/ && $2>0 {
byteSize=$2*unit2exp[$3]; procName[tgid]=name; procSwap[tgid]=byteSize; totSwap+=byteSize
}
EXECUTE
awk -f test.sh /proc/[0-9]*/status 2>/dev/null
rm test.sh
Ceux qui sont experts sauront intégrer ce qui convient dans une application.
Dernière modification par geole (Le 21/04/2021, à 18:01)
Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit, utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248
En ligne
#20 Le 21/04/2021, à 18:18
- Tawal
Re : Processus Swapés - script
En effet geole, ce que tu proposes pourrait se coller dans un terminal.
Mais quel intérêt ?
L'intérêt d'un script est d'être contenu dans un fichier afin de pouvoir l'exécuter à tout moment.
Le savoir n'a d’intérêt que si on le transmet.
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
#21 Le 21/04/2021, à 18:32
- geole
Re : Processus Swapés - script
Pour une recherche ponctuelle ou pour curiosité couplé avec une demande free -h
Si tu le mets dans un fichier, on a le même problème.
soit il tourne en tache de fond et c'est préparé longtemps à l'avance
Soit il faut le lancer ponctuellement
Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit, utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248
En ligne
#22 Le 21/04/2021, à 18:46
- Tawal
Re : Processus Swapés - script
Pour faire au plus simple :
Copie/Colle le script du #1 (je l'ai mis à jour) dans un fichier que tu sauvegardes sous un nom de ton choix.
Donne les droits d'exécution à ce fichier.
Place ce fichier dans un dossier du PATH (/usr/local/bin par exemple)
Maintenant, tu disposes d'une nouvelle commande portant le nom du fichier créé précédemment.
Il te suffit de taper le nom de cette commande dans un terminal pour avoir le retour.
Ça, c'est une recherche ponctuelle.
Pour un mode "tâche de fond", il faut inclure le script (ou la commande mais ...) dans un autre qui lui tournera en fond.
Le savoir n'a d’intérêt que si on le transmet.
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
#23 Le 19/10/2021, à 19:26
- Tawal
Re : Processus Swapés - script
Hello,
Je reviens ici car le script du #1 (mis à jour au cours de cette discussion) 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 :
sudo swapoff -a
et
sudo 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 :
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
Dernière modification par Tawal (Le 19/10/2021, à 19:30)
Le savoir n'a d’intérêt que si on le transmet.
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
#24 Le 19/10/2021, à 19:42
- lynn
Re : Processus Swapés - script
Bonjour,
À la ligne 3 ce ne serait pas swaps ? Il est écrit smaps ??
tail -n +1 /proc/[0-9]*/smaps
édit : C'est bien smaps en fait.
Dernière modification par lynn (Le 19/10/2021, à 20:35)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#25 Le 19/10/2021, à 20:38
- Tawal
Re : Processus Swapés - script
Non, non, c'est bien smaps, c'est dans ces fichiers qu'on trouve les valeurs du swap pour chaque thread du processus
Edit:
On s'est croisés
Dernière modification par Tawal (Le 19/10/2021, à 20:39)
Le savoir n'a d’intérêt que si on le transmet.
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