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 |