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?
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é.
étant donné votre exemple ci-dessus - pour trouver les processus attachés à shmid 98306
lsof | egrep "98306|COMMAND"
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
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 -