web-dev-qa-db-ja.com

UNIXプロセスで使用されているファイル

fuserコマンドは、どのプロセスがファイルまたはディレクトリを使用しているかを知らせてくれます。

逆のコマンドを探しています。プロセスで使用されているファイルを教えてください。


更新

Solarisシステム用であることを忘れてしまいました。

14
lamcro

Dtraceを学んだり、ソフトウェアのインストールの経験を積んだりする人を恨むつもりはありませんが、Solarisではisプロセスが開いているファイルを確認するコマンドがあります:/ usr/bin/pfiles

% tail -f /etc/motd &
[1] 6033

% pfiles 6033
6033:   tail -f /etc/motd

      Current rlimit: 256 file descriptors
       0: S_IFREG mode:0644 dev:182,65538 ino:163065 uid:0 gid:3 size:54
          O_RDONLY|O_LARGEFILE
          /etc/motd
       1: S_IFCHR mode:0620 dev:299,0 ino:718837882 uid:101 gid:7 rdev:24,3
          O_RDWR|O_NOCTTY|O_LARGEFILE
          /dev/pts/3
       2: S_IFCHR mode:0620 dev:299,0 ino:718837882 uid:101 gid:7 rdev:24,3
          O_RDWR|O_NOCTTY|O_LARGEFILE
          /dev/pts/3
13
tpgould
lsof -p <pid>

から ここ

lsofは「LiSt OpenFiles」の略です。このシェルコマンドは一見シンプルに見えます。UNIXボックスのプロセスによって開かれたファイルに関する情報を一覧表示します。

その(見かけの)控えめなミッションステートメントにもかかわらず、lsofは実際には最も強力で便利なUNIXコマンドの1つです。その生の力は、「UNIXではすべてがファイルである」とよく言われるUNIXの設計原則の1つに由来します。これが意味するのは、開いているファイルのlsofの概念は、通常のファイルだけでなく、次のこともカバーしているということです。

  • ディレクトリ
  • ストリームまたはネットワークファイル(たとえば、インターネットまたはUNIXドメインソケットおよびNFSファイル)
  • ネイティブライブラリ(たとえば、プロセスにリンクされた.soor .dylibdynamicライブラリ)
  • 特殊ファイルのブロックと文字化(ディスクボリューム、外付けハードドライブ、コンソール、マウスなど)
  • パイプ

待ってください、システムでlsofが見つかりません!

lsofは非常に人気のあるツールであるため、ほとんどすべてのUNIX方言(Linux、Mac OS X、BSD、Solarisなど)に移植されています。ボックスで使用できない場合は、通常のパッケージ管理システムを使用してインストールしてください。 Solaris用のlsofパッケージは Sun Freeware にあります。

一部のUNIXシステム(IE:Linux)では、プロセスによって開かれたすべてのファイルにFDIDがあります。

これらは下で見ることができます

/ proc/$ PID/fd

ls -la /proc/2055/fd 
total 0
dr-x------ 2 kent kent  0 Nov 19 21:44 .
dr-xr-xr-x 7 kent kent  0 Nov 19 21:42 ..
lr-x------ 1 kent kent 64 Nov 19 21:44 0 -> /dev/null
l-wx------ 1 kent kent 64 Nov 19 21:44 1 -> /home/kent/.xsession-errors
lrwx------ 1 kent kent 64 Nov 19 21:44 10 -> socket:[3977613]
lrwx------ 1 kent kent 64 Nov 19 21:44 11 -> /home/kent/.googleearth/Cache/dbCache.dat
lrwx------ 1 kent kent 64 Nov 19 21:44 12 -> /home/kent/.googleearth/Cache/dbCache.dat.index
lrwx------ 1 kent kent 64 Nov 19 21:44 13 -> socket:[3978765]
lrwx------ 1 kent kent 64 Nov 19 21:44 14 -> socket:[3978763]
lrwx------ 1 kent kent 64 Nov 19 21:44 15 -> socket:[3978766]
lrwx------ 1 kent kent 64 Nov 19 21:44 17 -> socket:[3978764]
l-wx------ 1 kent kent 64 Nov 19 21:44 2 -> /home/kent/.xsession-errors
lr-x------ 1 kent kent 64 Nov 19 21:44 3 -> pipe:[3977583]
l-wx------ 1 kent kent 64 Nov 19 21:44 4 -> pipe:[3977583]
lr-x------ 1 kent kent 64 Nov 19 21:44 5 -> pipe:[3977584]
l-wx------ 1 kent kent 64 Nov 19 21:44 6 -> pipe:[3977584]
lr-x------ 1 kent kent 64 Nov 19 21:44 7 -> pipe:[3977587]
l-wx------ 1 kent kent 64 Nov 19 21:44 8 -> pipe:[3977587]
lrwx------ 1 kent kent 64 Nov 19 21:44 9 -> socket:[3977588]

さらに、「FDINFO」が表示されることもあります(これはLinuxのカーネルフラグだと思います)。

cat /proc/2055/fdinfo/11 
pos:    232741818
flags:  02
1
Kent Fredric
  1. lsコマンドとgrepを使用して、chromeで使用されているファイルを見つけることができます。

$ ls -l/proc/*/fd | grep "chrome"

lrwx ------ 1 ba abc 64 Jul 16 22:19 104-> /home/abc/.config/google-chrome/Default/Cookies

lr-x ------ 1 abc abc 64 Jul 16 22:19 113-> /opt/google/chrome/nacl_irt_x86_64.nexe

lrwx ------ 1 abc abc 64 Jul 16 22:19 121-> /home/abc/.cache/google-chrome/Default/Cache/data_0

lrwx ------ 1 abc abc 64 Jul 16 22:19 122-> /home/abc/.cache/google-chrome/Default/Cache/data_1

lrwx ------ 1 abc abc 64 Jul 16 22:19 123-> /home/abc/.cache/google-chrome/Default/Cache/data_2

lr-x ------ 1 abc abc 64 Jul 16 22:19 125-> /home/abc/.config/google-chrome/Dictionaries/en-US-3-0.bdic

lsofおよびgrepを使用して結果を見つける別のコマンド

$ lsof | grep "chrome"

chrome 2204 abc cwd DIR 8,5 4096 1441794/home/abc

chrome 2204 abc rtd DIR 8,5 4096 2 /

chrome 2204 abc txt REG 8,5 87345336 5111885/opt/google/chrome/chrome

chrome 2204 abc mem REG 8,5 4202496 1443927 /home/abc/.cache/google-chrome/Default/Media Cache/data_3

chrome 2204 abc mem REG 8,5 1056768 1443926 /home/abc/.cache/google-chrome/Default/Media Cache/data_2

chrome 2204 abc mem REG 8,5 270336 1443925 /home/abc/.cache/google-chrome/Default/Media Cache/data_1

chrome 2204 abc mem REG 8,5 45056 1443924 /home/abc/.cache/google-chrome/Default/Media Cache/data_0

1
SRINIVAS KATLA
1
Vinko Vrsalovic

これはdtraceの古典的なアプリケーションです。

構文を正確に思い出せませんが、システム上の任意のプロセスによってファイルが開かれるたびにトレースが起動する可能性があります。これは、実行中のシステムで、予想していたほどのオーバーヘッドなしで実行できます。管理者としてsolarisを実行している場合、dtraceはあなたの親友です。あなたがプログラマーでなくても、学ぶのは非常に簡単で、非常に強力なシステムクエリツールです。

1