it-swarm.com.de

Wie liste ich Prozesse auf, die an ein Shared Memory-Segment in Linux angeschlossen sind?

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?

35
Andrew Wagner

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.

37
paxdiablo

ihr Beispiel oben - um Prozesse zu finden, die mit shmid 98306 verbunden sind

lsof | egrep "98306|COMMAND"
20
chaosless

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
1
jacuro

Use ipcs -a: liefert detaillierte Informationen zu allen Ressourcen [Semaphor, Shared-Memory usw.] 

Hier ist das Bild der Ausgabe - 

hier klicken um das Bild zu öffnen

0
Darshan Sharma