web-dev-qa-db-fra.com

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

Comment déterminer quel processus est attaché à un segment de mémoire partagée?

awagner@tree:/home/awagner$ ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 0          root       777        102400     1                       
0x00000000 32769      root       774        96         1          dest         
0x00000000 98306      awagner    600        393216     2          dest         
0x00000000 131075     awagner    600        393216     2          dest    

comment déterminer quels sont les deux processus liés au shmid 98306?

35
Andrew Wagner

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

Avec un segment attaché à deux processus, en supposant que les deux est resté attaché, vous pouvez éventuellement déterminer à partir du PID créateur cpid et du dernier PID attaché lpid qui sont les deux processus mais qui ne peuvent pas dépasser deux. processus de sorte que son utilité est limitée.

La méthode cat /proc/sysvipc/shm semble également limitée, mais je pense qu’il est possible de le faire avec d’autres parties du système de fichiers /proc, comme indiqué ci-dessous:

Lorsque je fais une grep sur les cartes procfs pour tous les processus, des entrées contenant des lignes pour les processus cpid et lpid sont générées.

Par exemple, j'obtiens le segment de mémoire partagée suivant à partir 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, la cpid est 3956 et la 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)

Il y a donc un moyen d'obtenir les processus qui s'y rattachent. Je suis à peu près certain que les indicateurs dest status et (deleted) sont dus au fait que le créateur a marqué le segment à détruire une fois que le détachement final a eu lieu, mais qu'il n'a pas déjà été détruit.

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

37
paxdiablo

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

lsof | egrep "98306|COMMAND"
20
chaosless

J'ai écrit un outil appelé who_attach_shm.pl, qui 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
1
jacuro

Utilisez ipcs -a: donne des informations détaillées sur toutes les ressources [sémaphore, mémoire partagée, etc.] 

Voici l'image de la sortie - 

cliquez ici pour ouvrir l'image

0
Darshan Sharma