GNU/Linux >> Tutoriels Linux >  >> Linux

Comment répertorier les processus attachés à un segment de mémoire partagée sous Linux ?

Juste au cas où quelqu'un ne s'intéresse qu'au type de processus qui a créé les moeries partagées, appelez

ls -l /dev/shm

Il répertorie les noms associés aux mémoires partagées - du moins sur Ubuntu. Habituellement, les noms sont assez parlants.


Je ne pense pas que vous puissiez le faire avec les outils standard. Vous pouvez utiliser ipcs -mp pour obtenir l'ID de processus du dernier processus pour attacher/détacher mais je ne sais pas comment obtenir tous processus attachés avec ipcs .

Avec un segment attaché à deux processus, en supposant qu'ils restent tous les deux ci-joint, vous pouvez éventuellement déterminer à partir du créateur PID cpid et le dernier PID attaché lpid qui sont les deux processus, mais qui ne s'adaptera pas à plus de deux processus, son utilité est donc limitée.

Le cat /proc/sysvipc/shm la méthode semble également limitée mais je pense qu'il existe un moyen de le faire avec d'autres parties du /proc système de fichiers, comme indiqué ci-dessous :

Quand je fais un grep sur le procfs cartes pour tous les processus, j'obtiens des entrées contenant des lignes pour le cpid et lpid processus.

Par exemple, j'obtiens le segment de mémoire partagée suivant de ipcs -m :

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 123456     pax        600        1024       2          dest

et, à partir de ipcs -mp , le cpid est 3956 et le lpid est 9999 pour ce segment de mémoire partagée donné (123456).

Puis, avec la commande grep 123456 /proc/*/maps , je vois :

/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted)
/proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted)

Donc il y a un moyen d'obtenir les processus qui s'y rattachent. Je suis à peu près certain que le dest statut et (deleted) sont parce que le créateur a marqué le segment pour destruction une fois le détachement final effectué, et non qu'il a déjà été détruit.

Ainsi, en scannant le /proc/*/maps "fichiers", vous devriez être en mesure de découvrir quels PID sont actuellement attachés à un segment donné.


J'ai écrit un outil appelé who_attach_shm.pl, il analyse /proc/[pid]/maps pour obtenir les informations. Vous pouvez le télécharger depuis github

exemple de sortie :

shm attach process list, group by shm key
##################################################################

0x2d5feab4:    /home/curu/mem_dumper /home/curu/playd
0x4e47fc6c:    /home/curu/playd
0x77da6cfe:    /home/curu/mem_dumper /home/curu/playd /home/curu/scand

##################################################################
process shm usage
##################################################################
/home/curu/mem_dumper [2]:    0x2d5feab4 0x77da6cfe
/home/curu/playd [3]:    0x2d5feab4 0x4e47fc6c 0x77da6cfe
/home/curu/scand [1]:    0x77da6cfe

étant donné votre exemple ci-dessus - pour trouver les processus attachés à shmid 98306

lsof | egrep "98306|COMMAND"

Linux
  1. Comment effacer le cache mémoire sous Linux

  2. Comment puis-je obtenir une liste des réseaux sans fil disponibles sous Linux ?

  3. Comment utiliser la mémoire partagée avec Linux en C

  4. Comment puis-je être informé des erreurs ECC sous Linux ?

  5. Comment Linux alloue-t-il la bande passante entre les processus ?

Comment répertorier les packages installés sous Linux

Comment répertorier les partitions de disque sous Linux

Comment effacer la mémoire d'échange sous Linux

Comment répertorier les bibliothèques partagées utilisées par les exécutables sous Linux

Comment obtenir la liste des comptes utilisateur MySQL sous Linux

Comment obtenir une liste de liens symboliques sous Linux