Ipcs
| Fiche express | |
|---|---|
| Domaine | Ressources IPC System V (mémoire partagée, sémaphores, files de messages) |
| Commande | ipcs / ipcrm
|
| Contexte | Diagnostic de fuites IPC, nettoyage après un crash applicatif (bases de données notamment) |
| Voir aussi | Grep, Awk (filtrage de la sortie) |
ipcs affiche l'état des ressources de communication interprocessus System V actuellement allouées sur le système : segments de mémoire partagée, sémaphores et files de messages. Ces mécanismes sont largement utilisés par les bases de données (PostgreSQL, Oracle, DB2...) pour leur mémoire partagée interne, ce qui rend ipcs particulièrement utile pour diagnostiquer une fuite de ressources ou nettoyer des reliquats après un crash.
Affichage global
ipcs -a # affiche les trois types de ressources en une seule fois
Par type de ressource
ipcs -m # segments de mémoire partagée (shared memory)
ipcs -s # sémaphores (semaphore arrays)
ipcs -q # files de messages (message queues)
Exemple de sortie pour ipcs -m :
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x0052e2c1 32768 postgres 600 39845888 12
0xdeadbeef 65536 oracle 640 20971520 0
Colonnes utiles : shmid est l'identifiant à passer à ipcrm, owner l'utilisateur propriétaire, bytes la taille du segment, et nattch le nombre de process actuellement attachés — un segment avec nattch à 0 (comme le second ci-dessus) est un bon candidat orphelin, un segment avec nattch supérieur à 0 (comme le premier) est encore utilisé.
Supprimer une ressource IPC (ipcrm)
ipcrm -m <shmid> # supprimer un segment de mémoire partagée
ipcrm -s <semid> # supprimer un tableau de sémaphores
ipcrm -q <msqid> # supprimer une file de messages
⚠️ AVERTISSEMENT : supprimer une ressource IPC encore utilisée par un process vivant peut le faire planter immédiatement. Les bases de données comme PostgreSQL ou Oracle dépendent lourdement de leur mémoire partagée System V pour fonctionner : ne jamais faire de ipcrm à l'aveugle sur une instance en production sans avoir d'abord vérifié qu'aucun process ne l'utilise encore (colonne nattch, et éventuellement lsof/fuser pour identifier les PID attachés).
Nettoyer les IPC orphelins d'un utilisateur après un crash
Cas d'usage typique : une base de données (ou tout autre process s'appuyant sur IPC System V) crashe et laisse derrière elle des segments de mémoire partagée, sémaphores ou files de messages orphelins, toujours possédés par son utilisateur système mais qu'aucun process vivant n'utilise plus. Ces ressources ne se libèrent jamais toutes seules — il faut les repérer et les supprimer explicitement.
Repérer puis supprimer, ressource par ressource, tout ce qui appartient à un utilisateur donné (ici postgres) :
ipcs -m | grep postgres | awk '{print $2}' | xargs -r ipcrm -m
ipcs -s | grep postgres | awk '{print $2}' | xargs -r ipcrm -s
ipcs -q | grep postgres | awk '{print $2}' | xargs -r ipcrm -q
grep postgres filtre les lignes appartenant à cet utilisateur (colonne owner), awk '{print $2}' en extrait l'identifiant (shmid/semid/msqid, deuxième colonne dans les trois cas), et xargs -r ipcrm -m (ou -s/-q) l'exécute pour chaque identifiant trouvé. À vérifier avant coup : le champ nattch, pour s'assurer qu'aucun process vivant n'est encore attaché à ces segments avant de les supprimer.