Le répertoire /proc est en fait un pseudo système de fichiers. Les fichiers dans le répertoire /proc sont un miroir du système en cours d'exécution et des processus du noyau, et contiennent des informations et des statistiques sur elles.
bash$ cat /proc/devices
Character devices:
1 mem
2 pty
3 ttyp
4 ttyS
5 cua
7 vcs
10 misc
14 sound
29 fb
36 netlink
128 ptm
136 pts
162 raw
254 pcmcia
Block devices:
1 ramdisk
2 fd
3 ide0
9 md
bash$ cat /proc/interrupts
CPU0
0: 84505 XT-PIC timer
1: 3375 XT-PIC keyboard
2: 0 XT-PIC cascade
5: 1 XT-PIC soundblaster
8: 1 XT-PIC rtc
12: 4231 XT-PIC PS/2 Mouse
14: 109373 XT-PIC ide0
NMI: 0
ERR: 0
bash$ cat /proc/partitions
major minor #blocks name rio rmerge rsect ruse wio wmerge wsect wuse running use aveq
3 0 3007872 hda 4472 22260 114520 94240 3551 18703 50384 549710 0 111550 644030
3 1 52416 hda1 27 395 844 960 4 2 14 180 0 800 1140
3 2 1 hda2 0 0 0 0 0 0 0 0 0 0 0
3 4 165280 hda4 10 0 20 210 0 0 0 0 0 210 210
...
bash$ cat /proc/loadavg
0.13 0.42 0.27 2/44 1119
|
Des scripts shells peuvent extraire des données à partir de certains des fichiers de /proc. [1]
bash$ cat /proc/filesystems | grep iso9660
iso9660
|
kernel_version=$( awk '{ print $3 }' /proc/version ) |
CPU=$( awk '/model name/ {print $4}' < /proc/cpuinfo )
if [ $CPU = Pentium ]
then
lance_des_commandes
...
else
lance_des_commandes_différentes
...
fi |
Le répertoire /proc contient des sous-répertoires avec des noms numériques inhabituels. Chacun de ces noms correspond à un numéro de processus d'un processus en cours d'exécution. A l'intérieur de ces sous-répertoires, il existe un certain nombre de fichiers contenant des informations sur le processus correspondant. Les fichiers stat et status maintiennent des statistiques sur le processus, le fichier cmdline contient les arguments de la ligne de commande avec lesquels le processus a été appelé et le fichier exe est un lien symbolique vers le chemin complet du processus. Il existe encore quelques autres fichiers, mais ceux-ci sont les plus intéressants du point de vue de l'écriture de scripts.
Exemple 28-1. Trouver le processus associé à un PID
#!/bin/bash
# pid-identifier.sh: Donne le chemin complet du processus associé avec ce pid.
NBARGS=1 # Nombre d'arguments que le script attend.
E_MAUVAISARGS=65
E_MAUVAISPID=66
E_PROCESSUS_INEXISTANT=67
E_SANSDROIT=68
PROCFILE=exe
if [ $# -ne $NBARGS ]
then
echo "Usage: `basename $0` PID" >&2 # Message d'erreur >stderr.
exit $E_MAUVAISARGS
fi
nopid=$( ps ax | grep $1 | awk '{ print $1 }' | grep $1 )
# Cherche pid dans l'affichage de "ps", car il est le champ #1.
# S'assure aussi qu'il s'agit du bon processus, et non pas du processus appelé
# par ce script.
# Le dernier "grep $1" supprime cette possibilité.
if [ -z "$nopid" ] # Si, après tous ces filtres, le résultat est une chaîne vide
then # aucun processus en cours ne correspond au pid donné.
echo "Aucun processus en cours."
exit $E_PROCESSUS_INEXISTANT
fi
# Autrement:
# if ! ps $1 > /dev/null 2>&1
# then # Aucun processus ne correspond au pid donné.
# echo "Ce processus n'existe pas"
# exit $E_PROCESSUS_INEXISTANT
# fi
# Pour simplifier tout cet algorithme, utilisez "pidof".
if [ ! -r "/proc/$1/$PROCFILE" ] # Vérifiez les droits en lecture.
then
echo "Processus $1 en cours, mais..."
echo "Ne peut obtenir le droit de lecture sur /proc/$1/$PROCFILE."
exit $E_SANSDROIT
# Un utilisateur standard ne peut accéder à certains fichiers de /proc.
fi
# Les deux derniers tests peuvent être remplacés par:
# if ! kill -0 $1 > /dev/null 2>&1 # '0' n'est pas un signal, mais
# ceci testera s'il est possible
# d'envoyer un signal au processus.
# then echo "PID n'existe pas ou vous n'êtes pas son propriétaire" >&2
# exit $E_MAUVAISPID
# fi
fichier_exe=$( ls -l /proc/$1 | grep "exe" | awk '{ print $11 }' )
# Ou fichier_exe=$( ls -l /proc/$1/exe | awk '{print $11}' )
#
# /proc/pid-number/exe est un lien symbolique
# vers le chemin complet du processus appelé.
if [ -e "$fichier_exe" ] # Si /proc/pid-number/exe existe...
then # le processus correspondant existe.
echo "Processus #$1 appelé par $fichier_exe"
else
echo "Processus inexistant"
fi
# Ce script élaboré peut *pratiquement* être remplacé par
# ps ax | grep $1 | awk '{ print $5 }'
# Néanmoins, cela ne fonctionnera pas...
# parce que le cinquième champ de 'ps' est le argv[0] du processus,
# et non pas le chemin vers l'exécutable.
#
# Néanmoins, une des deux méthodes suivantes devrait fonctionner.
# find /proc/$1/exe -printf '%l\n'
# lsof -aFn -p $1 -d txt | sed -ne 's/^n//p'
# Commentaires supplémentaires par Stephane Chazelas.
exit 0 |
Exemple 28-2. Etat de la connexion
#!/bin/bash
NOMPROC=pppd # démon ppp.
NOMFICHIERPROC=status # Où chercher.
NONCONNECTE=65
INTERVALLE=2 # Mise à jour toutes les 2 secondes.
nopid=$( ps ax | grep -v "ps ax" | grep -v grep | grep $NOMPROC | awk '{ print $1 }' )
# Trouver le numéro de processus de 'pppd', le 'démon ppp'.
# Doit filtrer les lignes de processus générées par la recherche elle-même.
#
# Néanmoins, comme Oleg Philon l'a indiqué,
#+ ceci pourrait être considérablement simplifié en utilisant "pidof".
# nopid=$( pidof $NOMPROC )
#
# Morale de l'histoire:
#+ Quand une séquence de commandes devient trop complexe, cherchez un raccourci.
if [ -z "$pidno" ] # Si pas de pid, alors le processus ne tourne pas.
then
echo "Non connecté."
exit $NONCONNECTE
else
echo "Connecté."; echo
fi
while [ true ] # Boucle sans fin, le script peut être amélioré ici.
do
if [ ! -e "/proc/$pidno/$NOMFICHIERPROC" ]
# Quand le processus est en cours d'exécution, alors le fichier "status"
#+ existe.
then
echo "Disconnected."
exit $NONCONNECTE
fi
netstat -s | grep "packets received" # Obtenir quelques statistiques de
netstat -s | grep "packets delivered" #+ connexion.
sleep $INTERVALLE
echo; echo
done
exit 0
# De cette façon, le script ne se termine qu'avec un Control-C.
# Exercices:
# ---------
# Améliorer le script pour qu'il se termine suite à l'appui sur la touche
# "q".
# Rendre le script plus facilement utilisable d'autres façons. |
![]() | En général, il est dangereux d'écrire dans les fichiers de /proc, car cela peut corrompre le système de fichiers ou provoquer une erreur fatale. |
| [1] | Certaines commandes système, telles que procinfo, free, vmstat, lsdev, et uptime le font aussi. |
| Précédent | Sommaire | Suivant |
| /dev | Niveau supérieur | Des Zéros et des Nulls |