Как вывести список процессов, прикрепленных к сегменту разделяемой памяти в Linux? - PullRequest
39 голосов
/ 14 апреля 2011

Как определить, какой процесс подключен к сегменту совместно используемой памяти?

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    

, т.е. как определить, какие два процесса подключены к shmid 98306?

Ответы [ 4 ]

41 голосов
/ 14 апреля 2011

Я не думаю, что вы можете сделать это с помощью стандартных инструментов. Вы можете использовать ipcs -mp, чтобы получить идентификатор процесса последний процесс для присоединения / отсоединения, но я не знаю, как получить все присоединенные процессы с ipcs.

С сегментом, присоединенным к двум процессам, предполагая, что оба остались присоединенными, вы можете вычислить из PID cpid создателя и последнего подключенного PID lpid, которые являются двумя процессами, но это не будет масштабироваться до более чем двух процессов, поэтому его полезность ограничена.

Метод cat /proc/sysvipc/shm кажется таким же ограниченным, но я считаю, что есть способ сделать это с другими частями файловой системы /proc, как показано ниже:

Когда я делаю grep на картах procfs для всех процессов, я получаю записи, содержащие строки для процессов cpid и lpid.

Например, я получаю следующий сегмент общей памяти из ipcs -m:

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 123456     pax        600        1024       2          dest

, а с ipcs -mp cpid равно 3956, а lpid равно 9999 для данного сегмента общей памяти (123456).

Затем с помощью команды grep 123456 /proc/*/maps я вижу:

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

Так что - это способ получить процессы, которые к нему привязаны. Я почти уверен, что статус dest и индикатор (deleted) связаны с тем, что создатель пометил сегмент для уничтожения после того, как произойдет окончательное отделение, а не то, что он уже был уничтожен.

Таким образом, сканируя /proc/*/maps «файлы», вы сможете обнаружить, какие PID-коды в данный момент прикреплены к данному сегменту.

21 голосов
/ 19 июня 2011

приведенный выше пример - найти процессы, связанные с shmid 98306

lsof | egrep "98306|COMMAND"
2 голосов
/ 21 апреля 2013

Я написал инструмент who_attach_shm.pl, он анализирует / proc / [pid] / maps для получения информации.Вы можете скачать его с github

Пример вывода:

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
0 голосов
/ 20 февраля 2016

Использование ipcs -a: дает подробную информацию обо всех ресурсах [семафор, разделяемая память и т. Д.]

Вот изображение вывода:

image

...