一、Proc文件系統簡介
Proc 文件系統就是一個虛擬文件系統,它是內存文件系統,真正的不在磁碟上。
在 Linux 系統中,一切皆文件,包括硬體設備、網路協議等等,都被抽象成文件的形式,可以通過文件進行操作。而 proc 文件系統提供了一種介面,讓我們可以通過文件的形式來訪問 Linux 內核的信息,如進程信息、硬體信息、內核配置等。
它以文件和目錄樹的形式提供了與系統中其他進程進行交互和更新的一種方式。編寫 proc 文件的時候,可以使用標準C庫。即使在 Linux 系統之外,有些應用程序也使用 proc 文件介面。
二、Proc文件系統掛載
在 Linux 系統中,使用 mount 命令掛載 proc 文件系統。當我們運行 mount 命令的時候,我們可以看到 proc 文件系統已經被掛載到了 /procb 目錄下。
~$ mount
...
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
三、訪問進程信息
我們可以通過進程的 PID 獲取它的一些信息,如進程狀態、運行時間、佔用 CPU 的時間、線程信息等。
進程狀態可以通過訪問 /proc/[pid]/status 獲取,如下所示:
~$ cat /proc/4897/status
Name: nginx
Umask: 0022
[...]
進程的運行時間可以通過訪問 /proc/[pid]/stat 獲取:
~$ cat /proc/4897/stat
4897 (nginx) S 1 4897 4897 0 -1 4210688 107439 0 0 0 162 92 0 0 20 0 10 0 1730610 71272448 1808 18446744073709551615 94220644347712 94220644346916 140721911924288 0 0 0 0 4096 67174408 0 0 0 17 3 0 0 0 0 0
佔用 CPU 的時間可以通過訪問 /proc/[pid]/stat 獲取:
~$ cat /proc/4897/stat
4897 (nginx) S 1 4897 4897 0 -1 4210688 107439 0 0 0 162 92 0 0 20 0 10 0 1730610 71272448 1808 18446744073709551615 94220644347712 94220644346916 140721911924288 0 0 0 0 4096 67174408 0 0 0 17 3 0 0 0 0 0
線程信息可以通過訪問 /proc/[pid]/task/[tid]/stat 獲取:
~$ cat /proc/4897/task/7832/stat
7832 (nginx) S 1 4897 4897 0 -1 4202752 107439 0 0 0 1 1 0 0 20 0 11 0 1748803 42796032 2016 18446744073709551615 93914891620352 93914809483144 140721911918856 140045395672112 0 0 0 0 4096 67174560 0 0 0 17 3 0 0 0 0 0
四、進程和文件系統如何關聯起來
Proc 文件系統中的進程文件夾和其他文件夾操作上沒什麼區別,然而每個進程文件夾會指向 /proc/[PID] 目錄下的一個文件 stub。在初始化進程時,內核為進程所註冊的 proc_dir_entry 結構會連接到 /proc 文件系統的全局鏈表中。由於系統中所有進程都註冊了 proc_dir_entry 結構,因此 proc 文件系統提供了一種管理、訪問進程信息的統一介面。
五、Proc文件系統下常用的文件和目錄
1. /proc/[pid]/cmdline
/proc/[pid]/cmdline 文件包含了啟動進程時使用的命令行參數,以空格分隔的字元串表示,最後以 NULL 位元組結束。通過修改該文件的內容可以改變進程的啟動參數。
~$ cat /proc/4897/cmdline
nginx: master process nginx -g daemon on; master_process on;
2. /proc/[pid]/environ
/proc/[pid]/environ 文件記錄了進程的環境變數名和其值。默認情況下,環境變數之間以 NULL 位元組進行分隔。
~$ cat /proc/4897/environ
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LANG=en_US.UTF-8
LANGUAGE=en_US:en
[...]
3. /proc/[pid]/status
/proc/[pid]/status 文件可以提供關於特定進程的信息,如其內存使用情況、排隊信息、線程和文件描述符等。
~$ cat /proc/4897/status
Name: nginx
Umask: 0022
Status: S (sleeping)
Pid: 4897
PPid: 1
Gid: 0 0 0 0
VmSize: 420168 kB
VmPeak: 485316 kB
VmExe: /usr/sbin/nginx
VmLib: /lib/x86_64-linux-gnu/libpthread-2.23.so
VmData: 29272 kB
VmStk: 136 kB
[...]
4. /proc/filesystems
這個文件顯示當前正在使用的文件系統類型。/proc/filesystems 不顯示未載入文件系統的類型。
~$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cgroup
nodev cgroup2
[...]
5. /proc/loadavg
這個文件包含了三個數值,即運行隊列的平均長度(1分鐘內),運行隊列的平均長度(5分鐘內)和運行隊列的平均長度(15分鐘內)。
~$ cat /proc/loadavg
0.27 0.20 0.24 1/770 26077
6. /proc/sys
/proc/sys 是一個目錄,包含了一些系統運行時的變數,可以用於調整內核的行為。
例如,/proc/sys/net/ipv4/tcp_fin_timeout 文件表示 TCP 連接上發出最後一次數據包之後,連接仍打開的一段時間長度,按秒計算。如果 /proc/sys/net/ipv4/tcp_fin_timeout 中的值是 60,那麼連接在關閉它們之後將等待 60 秒之後關閉。
7. /proc/cpuinfo
/proc/cpuinfo 文件包含關於 CPU 配置、速度和緩存大小等信息。
~$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 79
[...]
以上是一些常用的文件和目錄,實際上 proc 文件系統提供了很多信息,限於篇幅和時間,無法一一播報。建議在使用過程中需要多多查詢相關文檔。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/159737.html