Wie kann ich feststellen, welcher Prozess an ein Shared Memory-Segment angehängt ist?
[email protected]:/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
wie kann ich herausfinden, welche zwei Prozesse an shmid 98306 hängen?
Ich glaube nicht, dass Sie dies mit den Standardwerkzeugen tun können. Sie können ipcs -mp
verwenden, um die Prozess-ID des last -Prozesses zum Anhängen/Trennen abzurufen. Ich weiß jedoch nicht, wie all angehängte Prozesse mit ipcs
abgerufen werden.
Mit einem aus zwei Prozessen verbundenen Segment, vorausgesetzt, dass beide geblieben angeschlossen sind, können Sie möglicherweise aus der Erstellungs-PID cpid
und der zuletzt angefügten PID lpid
herausfinden, welche beiden Prozesse die beiden Prozesse sind als zwei Prozesse, so ist seine Nützlichkeit begrenzt.
Die cat /proc/sysvipc/shm
-Methode scheint ähnlich begrenzt zu sein, aber ich glaube, es gibt eine Möglichkeit, dies mit anderen Teilen des /proc
-Dateisystems zu tun, wie unten gezeigt:
Wenn ich eine grep
auf den procfs
-Karten für alle Prozesse mache, erhalte ich Einträge mit Zeilen für die cpid
- und lpid
-Prozesse.
Beispielsweise erhalte ich das folgende Shared Memory-Segment von ipcs -m
:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 123456 pax 600 1024 2 dest
und von ipcs -mp
ist die cpid
3956 und die lpid
9999 für dieses gegebene gemeinsam genutzte Speichersegment (123456).
Dann sehe ich mit dem Befehl grep 123456 /proc/*/maps
:
/proc/3956/maps: blah blah blah 123456 /SYSV000000 (deleted)
/proc/9999/maps: blah blah blah 123456 /SYSV000000 (deleted)
Es gibt also is eine Möglichkeit, die damit verbundenen Prozesse zu erhalten. Ich bin mir ziemlich sicher, dass der dest
-Status und der (deleted)
-Indikator darauf zurückzuführen sind, dass der Ersteller das Segment für die Zerstörung markiert hat, sobald die endgültige Trennung erfolgt, und nicht, dass es bereits zerstört wurde.
Durch Scannen der /proc/*/maps
- "Dateien" sollten Sie also feststellen können, welche PIDs derzeit an ein bestimmtes Segment angehängt sind.
ihr Beispiel oben - um Prozesse zu finden, die mit shmid 98306 verbunden sind
lsof | egrep "98306|COMMAND"
Ich habe ein Tool namens who_attach_shm.pl geschrieben, das/proc/[pid]/maps analysiert, um die Informationen zu erhalten. Sie können es von github herunterladen.
beispielausgabe:
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
Use ipcs -a: liefert detaillierte Informationen zu allen Ressourcen [Semaphor, Shared-Memory usw.]
Hier ist das Bild der Ausgabe -