GNU/Linux >> Linux の 問題 >  >> Linux

Linuxで共有メモリセグメントに接続されているプロセスを一覧表示する方法は?

誰かが共有モエリーを作成したプロセスだけに興味がある場合に備えて、呼び出してください

ls -l /dev/shm

少なくともUbuntuでは、共有メモリに関連付けられている名前がリストされています。通常、名前は非常にわかりやすいです。


標準のツールではこれを行うことはできないと思います。 ipcs -mp を使用できます 最後ののプロセスIDを取得する 取り付け/取り外しのプロセスですが、すべてを取得する方法がわかりません ipcs で添付されたプロセス .

2 つのプロセスが接続されたセグメントで、両方が残っていると仮定します。 作成者の PID cpid からわかる可能性があります。 および最後に添付された PID lpid これは 2 つのプロセスですが、2 つ以上のプロセスには拡張できないため、その有用性は限られています。

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 です その特定の共有メモリ セグメント (123456) では 9999 です。

次に、コマンド 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 をスキャンすることで "files" を使用すると、特定のセグメントに現在どの PID が関連付けられているかを検出できるはずです。


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

上記の例では、shmid 98306 に接続されているプロセスを検索します

lsof | egrep "98306|COMMAND"

Linux
  1. Linuxでメモリキャッシュをクリアする方法

  2. Linux で利用可能なワイヤレス ネットワークのリストを取得するにはどうすればよいですか?

  3. Linux はどのようにプロセス間で帯域幅を割り当てますか?

  1. LinuxSSコマンドの使用方法

  2. Linux in C で共有メモリを使用する方法

  3. Linux で ECC エラーの通知を受け取るにはどうすればよいですか?

  1. Linuxで実行中のプロセスを一覧表示する方法

  2. Linuxで実行中のプロセスを一覧表示する方法:初心者向けガイド

  3. Linuxでユーザーを一覧表示する方法