Linux Proc文件系統:了解Linux進程的內部機制

一、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-hant/n/159737.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-20 00:15
下一篇 2024-11-20 00:15

相關推薦

  • 如何通過jstack工具列出假死的java進程

    假死的java進程是指在運行過程中出現了某些問題導致進程停止響應,此時無法通過正常的方式關閉或者重啟該進程。在這種情況下,我們可以藉助jstack工具來獲取該進程的進程號和線程號,…

    編程 2025-04-29
  • Spring S_CSRF防護機制實現及應用

    Spring S_CSRF防護機制是Spring Security框架提供的一個針對跨站請求偽造攻擊(CSRF)的保護機制。本文將從以下幾個方面詳細介紹Spring S_CSRF防…

    編程 2025-04-28
  • Java中的殭屍進程簡介與解決方法

    本文將對Java中的殭屍進程進行詳細闡述,並給出幾種解決方法。 一、殭屍進程的概念 在操作系統中,進程是指正在執行的程序。當一個進程創建了一個子進程,而該子進程完成了任務卻沒有被父…

    編程 2025-04-27
  • 分布式文件系統數據分布算法

    數據分布算法是分布式文件系統中的重要技術之一,它能夠實現將文件分散存儲於各個節點上,提高系統的可靠性和性能。在這篇文章中,我們將從多個方面對分布式文件系統數據分布算法進行詳細的闡述…

    編程 2025-04-27
  • 如何在Linux中添加用戶並修改配置文件

    本文將從多個方面詳細介紹在Linux系統下如何添加新用戶並修改配置文件 一、添加新用戶 在Linux系統下創建新用戶非常簡單,只需使用adduser命令即可。使用以下命令添加新用戶…

    編程 2025-04-27
  • 多線程和多進程的應用

    多線程和多進程是現代編程中常用的技術,可以提高程序的效率和性能。本文將從不同的角度對多線程和多進程進行詳細的介紹和應用。 一、多線程 vs 多進程 多線程和多進程都是為了實現程序並…

    編程 2025-04-27
  • Python多進程讀取數據

    本文將從多個方面詳細闡述在Python中如何通過多進程讀取數據,並給出完整的代碼示例。 一、多進程概述 在計算機科學中,進程是正在執行的程序實例。多進程是指計算機系統同時執行多個進…

    編程 2025-04-27
  • Python的垃圾回收機制

    本文將對Python的垃圾回收機制進行詳細闡述,着重介紹它的基本原理和實現方式。此外,我們還將介紹常見的問題及解決方法,並給出相應的代碼示例。 一、Python的垃圾回收概述 垃圾…

    編程 2025-04-27
  • 如何解決linux jar包 invalid or corrupt jarfile問題

    對於許多開發人員和系統管理員在Linux環境下使用Java開發過程中遇到的一個常見的問題是 invalid or corrupt jarfile(無效或損壞的jar文件)錯誤。當您…

    編程 2025-04-27
  • 機制與策略分離

    了解機制與策略分離的解決方法與優勢 一、概述 機制與策略分離是一種軟件設計理念,它將複雜的系統、組件等模塊化,通過分離機制與策略,把模塊實現的方式與具體使用方式分開。 機制是實現某…

    編程 2025-04-27

發表回復

登錄後才能評論