GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie listet man Prozesse auf, die an ein Shared-Memory-Segment in Linux angehängt sind?

Nur für den Fall, dass jemand nur daran interessiert ist, welche Art von Prozess die freigegebenen Bilder erstellt hat, rufen Sie an

ls -l /dev/shm

Es listet die Namen auf, die mit den gemeinsamen Erinnerungen verbunden sind - zumindest auf Ubuntu. Normalerweise sind die Namen ziemlich aussagekräftig.


Ich glaube nicht, dass Sie dies mit den Standardwerkzeugen tun können. Sie können ipcs -mp verwenden um die Prozess-ID des letzten zu erhalten Vorgang zum Anhängen/Trennen, aber ich weiß nicht, wie ich alle bekomme angehängte Prozesse mit ipcs .

Mit einem an zwei Prozesse angehängten Segment, vorausgesetzt, sie sind beide geblieben angehängt, können Sie möglicherweise aus der Ersteller-PID cpid herausfinden und zuletzt angehängte PID lpid Das sind die beiden Prozesse, aber das lässt sich nicht auf mehr als zwei Prozesse skalieren, sodass seine Nützlichkeit begrenzt ist.

Die cat /proc/sysvipc/shm -Methode scheint ähnlich begrenzt zu sein, aber ich glaube, dass es eine Möglichkeit gibt, dies mit anderen Teilen des /proc zu tun Dateisystem, wie unten gezeigt:

Wenn ich eine grep mache auf der procfs maps für alle Prozesse erhalte ich Einträge, die Zeilen für cpid enthalten und lpid Prozesse.

Zum Beispiel 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 ab ipcs -mp , die cpid ist 3956 und die lpid ist 9999 für dieses gegebene gemeinsam genutzte Speichersegment (123456).

Dann mit dem Befehl grep 123456 /proc/*/maps , ich sehe:

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

Also gibt es eine Möglichkeit, die damit verbundenen Prozesse zu erhalten. Ich bin mir ziemlich sicher, dass die dest Status und (deleted) Indikator sind, weil 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.

Also durch Scannen des /proc/*/maps "Dateien", sollten Sie feststellen können, welche PIDs derzeit an ein bestimmtes Segment angehängt sind.


Ich habe ein Tool namens who_attach_shm.pl geschrieben, es analysiert /proc/[pid]/maps, 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

In Anbetracht Ihres obigen Beispiels - um Prozesse zu finden, die an shmid 98306 angehängt sind

lsof | egrep "98306|COMMAND"

Linux
  1. So löschen Sie den Speichercache in Linux

  2. Wie erhalte ich eine Liste der verfügbaren drahtlosen Netzwerke unter Linux?

  3. So verwenden Sie Shared Memory mit Linux in C

  4. Wie werde ich über ECC-Fehler in Linux benachrichtigt?

  5. Wie weist Linux Bandbreite zwischen Prozessen zu?

So listen Sie installierte Pakete in Linux auf

So listen Sie Festplattenpartitionen unter Linux auf

So löschen Sie den Auslagerungsspeicher unter Linux

So listen Sie gemeinsam genutzte Bibliotheken auf, die von ausführbaren Dateien in Linux verwendet werden

So erhalten Sie eine Liste der MySQL-Benutzerkonten unter Linux

So erhalten Sie eine Liste symbolischer Links unter Linux