Подтвердить что ты не робот

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

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

[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    

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

4b9b3361

Ответ 1

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

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

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

Когда я делаю a 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 в настоящее время подключены к данному сегменту.

Ответ 2

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

lsof | egrep "98306|COMMAND"

Ответ 3

Я написал инструмент 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

Ответ 4

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

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

image