ホームページ > 記事 > システムチュートリアル > Linux の /proc/[pid] ディレクトリ内のファイルの簡単な分析
Linux カーネルは、カーネルの内部データ構造にアクセスし、実行時に proc ファイル システムを通じてカーネル設定を変更するメカニズムを提供します。 proc ファイル システムは、メモリ内にのみ存在し、外部メモリ領域を占有しない疑似ファイル システムです。ファイル システムの形式でシステム カーネル データにアクセスするためのインターフェイスを提供します。
ユーザーとアプリケーションは、proc を通じてシステム情報を取得し、カーネルの一部のパラメーターを変更できます。プロセスなどのシステム情報は動的に変化するため、ユーザーまたはアプリケーションが proc ファイルを読み取ると、proc ファイル システムはシステム カーネルから必要な情報を動的に読み取り、送信します。
カーネル構成とロードされたモジュールによっては、以下にリストされているすべてのファイルまたはサブフォルダーがシステムに存在するわけではありません。さらに、proc の下には、net、scsi、sys という 3 つの非常に重要なディレクトリがあります。 sys ディレクトリは書き込み可能で、カーネル パラメータへのアクセスや変更に使用できますが、net と scsi はカーネル設定に依存します。たとえば、システムが scsi をサポートしていない場合、scsi ディレクトリは存在しません。
上で紹介したもの以外にも、プロセスディレクトリと呼ばれる数字の付いたディレクトリがいくつかあります。現在システム内で動作している各プロセスは、proc配下にプロセスのPID番号をディレクトリ名として対応するディレクトリを持ち、プロセス情報を読み取るためのインターフェースとなります。自己ディレクトリは、プロセス自体を読み込むための情報インターフェースであり、リンクです。
/proc/[pid]/auxv には、プロセスに渡される ELF インタープリタ情報が含まれます。形式は、各項目が符号なしの長い長さの ID と符号なしの長い長さの値です。最後の項目は、連続する 2 つの 0x00 で始まります。例は次のとおりです:
$ hexdump -x /proc/2406/auxv 0000000 0021 0000 0000 0000 f000 f7fa 7fff 0000 0000010 0010 0000 0000 0000 fbff 1f8b 0000 0000 0000020 0006 0000 0000 0000 1000 0000 0000 0000 0000030 0011 0000 0000 0000 0064 0000 0000 0000 0000040 0003 0000 0000 0000 0040 0040 0000 0000 0000050 0004 0000 0000 0000 0038 0000 0000 0000 0000060 0005 0000 0000 0000 0007 0000 0000 0000 0000070 0007 0000 0000 0000 0000 0000 0000 0000 0000080 0008 0000 0000 0000 0000 0000 0000 0000 0000090 0009 0000 0000 0000 55e0 0045 0000 0000 00000a0 000b 0000 0000 0000 0000 0000 0000 0000 00000b0 000c 0000 0000 0000 0000 0000 0000 0000 00000c0 000d 0000 0000 0000 0000 0000 0000 0000 00000d0 000e 0000 0000 0000 0000 0000 0000 0000 00000e0 0017 0000 0000 0000 0000 0000 0000 0000 00000f0 0019 0000 0000 0000 f079 f7f6 7fff 0000 0000100 001f 0000 0000 0000 フェア f7f6 7fff 0000 0000110 000f 0000 0000 0000 f089 f7f6 7fff 0000 0000120 0000 0000 0000 0000 0000 0000 0000 0000 0000130
/proc/[pid]/cmdline は、プロセスの完全なコマンド ライン情報が含まれる読み取り専用ファイルです。プロセスがメモリからスワップアウトされた場合、またはプロセスがゾンビ プロセスである場合、このファイルには内容がありません。ファイルは改行文字ではなくヌル文字で終わります。例は次のとおりです:
$ ps aux|grep frps root 2406 0.1 0.1 54880 10524 ? Sl Dec11 21:30 frps -c ./frps.ini $ cat /proc/2406/cmdline frps-c./frps.ini
/proc/[pid]/comm にはプロセスのコマンド名が含まれます。例は次のとおりです:
$ cat /proc/2406/comm FRPS
/proc/[pid]/cwd は、プロセスの現在の作業ディレクトリへのシンボリック リンクです。例は次のとおりです:
$ ls -lt /proc/2406/cwd lrwxrwxrwx 1 ルート root 0 12 月 12 日 20:39 /proc/2406/cwd -> /home/mike/frp_0.13.0_linux_amd64
/proc/[pid]/environ プロセスの環境変数を表示します。例は次のとおりです:
$ strings /proc/2406/environ SUPERVISOR_GROUP_NAME=ssh TERM=リナックス SUPERVISOR_SERVER_URL=unix:///var/run/supervisor.sock SUPERVISOR_PROCESS_NAME=ssh ランレベル=2 UPSTART_EVENTS=ランレベル PREVLEVEL=N PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin UPSTART_INSTANCE= UPSTART_JOB=rc SUPERVISOR_ENABLED=1 ランレベル=2 PWD=/ 前=N
/proc/[pid]/exe は、実際に実行中のプログラムへのシンボリック リンクです。例は次のとおりです:
$ ls -lt /proc/2406/exe lrwxrwxrwx 1 ルート root 0 12 月 11 日 19:00 /proc/2406/exe -> /usr/bin/frps
/proc/[pid]/fd は、プロセスによって開かれたファイルを含むディレクトリです。例は次のとおりです:
$ ls -lt /proc/2406/fd lrwx------ 1 ルート root 64 12 月 24 日 09:39 77 -> ソケット:[44377722] lrwx------ 1 ルート root 64 12 月 17 日 15:07 47 -> ソケット:[29482617] lr-x------ 1 ルート root 64 12 月 12 日 20:18 0 -> パイプ:[13282] l-wx------ 1 ルート root 64 12 月 12 日 20:18 1 -> パイプ:[13283] lrwx------ 1 ルート root 64 12 月 12 日 20:18 10 -> ソケット:[12238218] lrwx------ 1 ルート root 64 12 月 12 日 20:18 4 -> anon_inode:[eventpoll] lrwx------ 1 ルート root 64 12 月 12 日 20:18 40 -> ソケット:[19378614]
ディレクトリ内の各項目は、開いているファイルを指すシンボリック リンクであり、番号はファイル記述子を表します。
/proc/[pid]/latency には、どのコードが大きな遅延を引き起こしているのかが表示されます。この機能を使用したい場合は、次を実行する必要があります:
$ エコー 1 > /proc/sys/kernel/latencytop
例は次のとおりです
$ cat /proc/2406/latency レイテンシのトップバージョン : v0.1 30667 10650491 4891 poll_schedule_timeout do_sys_poll SyS_poll system_call_fastpath 0x7f636573dc1d 8 105 44 futex_wait_queue_me futex_wait do_futex SyS_futex system_call_fastpath 0x7f6365a167bc
各行の最初の 3 つの数字は、次のコードの実行回数、合計実行遅延時間 (単位はマイクロ秒)、および最大実行遅延時間 (単位はマイクロ秒) です。以下は、コードの完全な呼び出しスタックです。
/proc/[pid]/maps プロセスのメモリ領域マッピング情報を表示します。例は次のとおりです:
$ cat /proc/2406/maps 00400000-006ea000 r-xp 00000000 fd:01 1727569 /usr/bin/frps 006ea000-00a6c000 r--p 002ea000 fd:01 1727569 /usr/bin/frps 00a6c000-00ab1000 rw-p 0066c000 fd:01 1727569 /usr/bin/frps 00ab1000-00ad4000 rw-p 00000000 00:00 0 c000000000-c00000b000 rw-p 00000000 00:00 0 c41feac000-c420000000 rw-p 00000000 00:00 0 c420000000-c420400000 rw-p 00000000 00:00 0 c420400000-c420700000 rw-p 00000000 00:00 0 c420700000-c420800000 rw-p 00000000 00:00 0 c420800000-c420900000 rw-p 00000000 00:00 0 c420900000-c420a00000 rw-p 00000000 00:00 0 c420a00000-c421ea0000 rw-p 00000000 00:00 0 c421ea0000-c422a00000 rw-p 00000000 00:00 0 c422a00000-c422a60000 rw-p 00000000 00:00 0 7f0418c01000-7f0418ee1000 rw-p 00000000 00:00 0 7ffff7f4f000-7ffff7f70000 rw-p 00000000 00:00 0 [スタック:5121] 7ffff7fad000-7ffff7faf000 r--p 00000000 00:00 0 [vvar] 7ffff7faf000-7ffff7fb1000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
注意すべき点は、[stack:] がスレッドのスタック情報であり、/proc/[pid]/task/[tid]/ パスに対応することです。
/proc/[pid]/root は、プロセスのルート ディレクトリへのシンボリック リンクです。例は次のとおりです:
$ ls -lt /proc/2406/root lrwxrwxrwx 1 ルート root 0 12 月 12 日 20:39 /proc/2406/root -> /
/proc/[pid]/stack には、現在のプロセスのカーネル コール スタック情報が表示されます。このファイルは、カーネルのコンパイル中に CONFIG_STACKTRACE コンパイル オプションがオンになっている場合にのみ生成されます。例は次のとおりです:
$ cat /proc/2406/stack [<ffffffff810fa996>] futex_wait_queue_me 0xc6/0x130 [<ffffffff810fb05d>] futex_wait 0x17d/0x270 [<ffffffff810fd2d5>] do_futex 0xd5/0x520 [<ffffffff810fd791>] SyS_futex 0x71/0x150 [<ffffffff8180cc76>]entry_SYSCALL_64_fastpath 0x16/0x75 [<ffffffffffffffff>] 0xffffffffffffffff </ffffffffffffffff></ffffffff8180cc76></ffffffff810fd791></ffffffff810fd2d5></ffffffff810fb05d></ffffffff810fa996>
/proc/[pid]/statm プロセスが占有するメモリサイズの統計情報を表示します。 7 つの値が含まれ、測定単位はページです (ページ サイズは getconf PAGESIZE を通じて取得できます)。例は次のとおりです:
$ cat /proc/2406/statm 13720 2617 493 746 0 12007 0
各値の意味:
a) プロセスが占有する合計メモリ b) 現時点でプロセスが占有している物理メモリ c) 他のプロセスと共有されるメモリ d) プロセスのコードセグメント e) 共有ライブラリ (バージョン 2.6 以降、この値は 0) f) プロセスのスタック g) ダーティ ページ (バージョン 2.6 以降、この値は 0)
/proc/[pid]/status には、プロセスのステータス情報が含まれます。その内容の多くは /proc/[pid]/stat および /proc/[pid]/statm と同じですが、より明確に表示されています。例は次のとおりです:
$ cat /proc/2406/ステータス 名前: FRPS 状態:S(スリープ) タグID: 2406 ギド: 0 ID:2406 PPid: 2130 トレーサーPid: 0 UID: 0 0 0 0 GID: 0 0 0 0 FDサイズ: 128 グループ: 0 NSstgid: 2406 NSスピッド: 2406 NSpgid: 2406 NSsid: 2130 Vmピーク: 54880kB Vmサイズ: 54880 kB VmLck: 0kB Vmピン:0kB VmHWM: 34872kB VmRSS: 10468kB Vmデータ: 47896 kB VmStk: 132kB VmExe: 2984 kB VmLib: 0 KB VmPTE: 68kB VmPMD: 20kB Vmスワップ: 0 kB Hugetlbページ: 0 kB スレッド: 11 シグQ: 0/31834 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 記号: 0000000000000000 署名: fffffffe7fc1feff キャプテン: 0000000000000000 CapPrm: 0000003ffffffffff CapEff: 0000003ffffffffff CapBnd: 0000003ffffffffff CapAmb: 0000000000000000 秒コンプ: 0 Cpus_allowed: f Cpus_allowed_list: 0-3 Mems_allowed: 00000000,00000001 Mems_allowed_list: 0 自発的_ctxt_switches: 2251028 nonvoluntary_ctxt_switches: 18031
シグナルに関する情報: SigQ は 2 つの部分に分かれています (例: 0/31834)。前者は現在キューにあるシグナル (0) を示し、後者はキューに合計で保存できるシグナルの数 (31834) を示します。 ); SigPnd 現在のスレッドの保留中の信号を表し、ShdPnd はプロセス全体の保留中の信号を示します。SigBlk、SigIgn、および SigCgt はそれぞれ、信号処理がブロックされているか、無視されているか、キャプチャされているかを示します。 (Unix シグナルに関する関連知識については、「Unix: シグナルの処理」を参照してください)。
/proc/[pid]/syscall は、現在のプロセスによって実行されているシステム コールを表示します。例は次のとおりです:
$ cat /proc/2406/syscall 202 0xab3730 0x0 0x0 0x0 0x0 0x0 0x7ffff7f6ec68 0x455bb3
最初の値はシステム コール番号 (202 はポーリングを表します)、その後に 6 つのシステム コールのパラメータ値 (レジスタ内にあります) が続き、最後の 2 つの値はスタック ポインタと命令カウンタの値です。現在のプロセスがブロックされているが、ブロックしている関数がシステム コールではない場合、システム コール番号の値は -1 になり、その後にスタック ポインターと命令カウンターの値が続きます。プロセスがブロックされていない場合、ファイルには実行中の文字列のみが含まれます。
このファイルは、カーネルのコンパイル中に CONFIG_HAVE_ARCH_TRACEHOOK コンパイル オプションがオンになっている場合にのみ生成されます。
/proc/[pid]/wchan プロセスがスリープしているときにカーネルによって現在実行されている関数を表示します。例は次のとおりです:
$ cat /proc/2406/wchan futex_wait_queue_meadmin
以上がLinux の /proc/[pid] ディレクトリ内のファイルの簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。