ホームページ  >  記事  >  システムチュートリアル  >  Linux の /proc/[pid] ディレクトリ内のファイルの簡単な分析

Linux の /proc/[pid] ディレクトリ内のファイルの簡単な分析

WBOY
WBOY転載
2024-03-16 19:31:121220ブラウズ

Linux カーネルは、カーネルの内部データ構造にアクセスし、実行時に proc ファイル システムを通じてカーネル設定を変更するメカニズムを提供します。 proc ファイル システムは、メモリ内にのみ存在し、外部メモリ領域を占有しない疑似ファイル システムです。ファイル システムの形式でシステム カーネル データにアクセスするためのインターフェイスを提供します。
简析Linux中 /proc/[pid] 目录的各文件

ユーザーとアプリケーションは、proc を通じてシステム情報を取得し、カーネルの一部のパラメーターを変更できます。プロセスなどのシステム情報は動的に変化するため、ユーザーまたはアプリケーションが proc ファイルを読み取ると、proc ファイル システムはシステム カーネルから必要な情報を動的に読み取り、送信します。

カーネル構成とロードされたモジュールによっては、以下にリストされているすべてのファイルまたはサブフォルダーがシステムに存在するわけではありません。さらに、proc の下には、net、scsi、sys という 3 つの非常に重要なディレクトリがあります。 sys ディレクトリは書き込み可能で、カーネル パラメータへのアクセスや変更に使用できますが、net と scsi はカーネル設定に依存します。たとえば、システムが scsi をサポートしていない場合、scsi ディレクトリは存在しません。

上で紹介したもの以外にも、プロセスディレクトリと呼ばれる数字の付いたディレクトリがいくつかあります。現在システム内で動作している各プロセスは、proc配下にプロセスのPID番号をディレクトリ名として対応するディレクトリを持ち、プロセス情報を読み取るためのインターフェースとなります。自己ディレクトリは、プロセス自体を読み込むための情報インターフェースであり、リンクです。

/proc/[pid]/auxv

/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

/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

/proc/[pid]/comm にはプロセスのコマンド名が含まれます。例は次のとおりです:

$ cat /proc/2406/comm
FRPS
/proc/[pid]/cwd

/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

/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

/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

/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

/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

/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

/proc/[pid]/root は、プロセスのルート ディレクトリへのシンボリック リンクです。例は次のとおりです:

$ ls -lt /proc/2406/root
lrwxrwxrwx 1 ルート root 0 12 月 12 日 20:39 /proc/2406/root -> /
/proc/[pid]/スタック

/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

/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]/ステータス

/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

/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

/proc/[pid]/wchan プロセスがスリープしているときにカーネルによって現在実行されている関数を表示します。例は次のとおりです:

$ cat /proc/2406/wchan
futex_wait_queue_meadmin

以上がLinux の /proc/[pid] ディレクトリ内のファイルの簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlinuxprobe.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。