Linux 特定の共有ライブラリをロードしているプロセスを調べる - TK's HP

TK's HP ホーム » スポンサー広告 » linux » Linux 特定の共有ライブラリをロードしているプロセスを調べる

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Linux 特定の共有ライブラリをロードしているプロセスを調べる

ふと自分の作った共有ライブラリを使用しているプロセスだけを表示したくなったので調べてみました。

psコマンドではどうやらできないようなので、複数のコマンドを組み合わせて実行しました。

コマンド

ps `grep 共有ライブラリの名前 /proc/*/maps | cut -d / -f 3`



実行例

libplds4をロードしているプロセスを表示
$ ps `grep libplds4 /proc/*/maps | cut -d / -f 3`
PID TTY STAT TIME COMMAND
1487 ? S 0:00 nm-applet --sm-disable
1494 ? S 0:01 nautilus
1550 ? S 0:00 /usr/lib/gnome-panel/clock-applet --oaf-activate-iid=
1600 ? Sl 3:51 /usr/lib/firefox-3.6.8/firefox-bin
1641 ? Sl 0:00 /usr/lib/evolution/2.28/evolution-alarm-notify
1777 ? Sl 0:01 /usr/lib/firefox-3.6.8/plugin-container /usr/lib/adob




以下解説です。

解説

/proc以下のディレクトリには、現在実行中のプロセスがディレクトリ(/proc/プロセス番号)として存在しています。

私の環境で見てみると、以下の様に表示されます。

$ ls /proc
1 1446 1516 1600 276 5 857 fb sched_debug
10 1450 1517 1640 277 510 876 filesystems schedstat
1006 1453 1519 1641 278 520 878 fs scsi
1011 1454 1522 1652 28 56 884 interrupts self
1018 1455 1524 1653 289 57 885 iomem slabinfo
1020 1457 1531 1654 29 58 886 ioports softirqs
1024 1459 1533 1671 3 59 888 irq stat
1029 1462 1546 1681 30 6 9 kallsyms swaps
1035 1464 1548 17 31 60 957 kcore sys
1036 1470 1550 1777 32 61 958 key-users sysrq-trigger
1096 1473 1554 18 328 62 960 kmsg sysvipc
1098 1478 1556 1814 329 63 acpi kpagecount timer_list
11 1483 1557 19 330 639 asound kpageflags timer_stats
12 1487 1558 2 345 64 buddyinfo latency_stats tty
1273 1489 1565 20 35 693 bus loadavg uptime
1298 1493 1566 21 36 7 cgroups locks version
13 1494 1569 22 37 722 cmdline mdstat version_signature
1317 1495 1571 23 373 747 cpuinfo meminfo vmallocinfo
1332 1496 1575 24 377 748 crypto misc vmstat
1336 1497 1578 25 38 749 devices modules zoneinfo
1340 15 1580 26 39 799 diskstats mounts
1344 1504 1582 261 4 8 dma mtrr
1397 1510 1588 266 40 824 dri net
14 1512 1591 27 41 845 driver pagetypeinfo
1415 1514 1596 275 42 856 execdomains partitions



この内の/proc/[pid]/mapsには現在マップされているメモリ領域とそのアクセスパーミッションがかかれています。 実はここにどのアドレスと一緒にどの共有ライブラリを使用しているかが書かれています。

プロセスID1600(firefox)の最初の5行を見てみると、

$ cat /proc/1600/maps | head -n 5
00110000-0012b000 r-xp 00000000 08:06 134524 /lib/ld-2.11.1.so
0012b000-0012c000 r--p 0001a000 08:06 134524 /lib/ld-2.11.1.so
0012c000-0012d000 rw-p 0001b000 08:06 134524 /lib/ld-2.11.1.so
0012d000-0012f000 r-xp 00000000 08:06 406362 /usr/lib/firefox-3.6.8/libplds4.so
0012f000-00130000 r--p 00001000 08:06 406362 /usr/lib/firefox-3.6.8/libplds4.so



lib****.soという表示があるので、この中を検索すれば良いということが分かります。


検索にはgrepコマンドを使用して検索します。
検索に引っかかるとファイルまでのパスが以下のように表示されます。


$ grep libplds4 /proc/*/maps
/proc/1487/maps:00368000-0036a000 r-xp 00000000 08:06 139010 /usr/lib/libplds4.so





この内の1487がプロセスIDなので、これをcutコマンドでとりだします。

$ grep libplds4 /proc/*/maps | cut -d / -f 3
1487
1487
1487
1494
1494
1494
1550
1550
1550
1600
1600
1600
1641
1641
1641
1777
1777
1777

-d / が'/'を区切り文字に指定
-f 3 が3番目のフィールドを指定
という意味です。


この結果をpsコマンドに渡すのが、最初にでてきたコマンドとなります。
上の例では同一のプロセスIDが複数回出てきていますが、psコマンドによってまとめられるので、実際には1回しか表示されません。
関連記事
記事に間違いなどがあればすぐに訂正いたしますので、コメントしてください。
コメント
非公開コメント

トラックバック

http://tclip.blog.fc2.com/tb.php/90-43f82128

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。