0.基礎環境
類別:筆記本
型號:中國長城 NF14C
硬件平台:飛騰處理器D2000(ArmV8 指令集)
系統:銀河麒麟操作系統 V10 SP1(2303)
關鍵詞:Linux,進程監控,ps,top
1.基礎理論
1.1程序、進程和線程三者的核心區別
| 特性維度 | 程序(Program) | 進程(Process) | 線程(Thread) |
|---|---|---|---|
| 本質 | 存儲在磁盤上的靜態指令集合與數據 | 程序的一次動態執行實例,是系統進行資源分配的基本單位 | 進程內的一個執行流,是 CPU調度 的基本單位 |
| 資源擁有 | 不佔用系統運行時資源 | 擁有獨立的地址空間、數據棧、文件描述符等系統資源 | 共享所屬進程的資源和地址空間,僅擁有獨立的棧、寄存器等少量必要資源 |
| 獨立性 | - | 高,進程間相互隔離,一個進程崩潰通常不會影響其他進程 | 低,線程共享進程資源,一個線程崩潰可能導致整個進程終止 |
| 創建與開銷 | - | 創建(通常通過 fork())和上下文切換開銷較大 |
創建(通過 pthread_create())和上下文切換開銷較小 |
| 通信機制 | - | 需要 IPC(進程間通信),如管道、消息隊列、共享內存、信號量 | 直接讀寫進程數據段進行通信,但需注意同步 |
| 主要應用場景 | 任何可執行文件 | 需要高隔離性、高穩定性的任務,如科學計算、安全沙箱、數據庫服務 | 需要高併發、頻繁數據共享的任務,如Web服務器、GUI應用、多線程下載 |
🔍 程序 (Program)
程序是存儲在磁盤或其他存儲介質上的靜態實體,它包含了一系列指令(代碼)和數據,其本身並不佔用系統運行時的資源(如CPU、內存)。例如,你編譯生成的 a.out 或 python_script.py 就是一個程序。
🔍 進程 (Process)
當程序被加載到內存並開始執行時,它就成為了一個進程。進程是系統進行資源分配和調度的獨立單位 。每個進程都有自己獨立的虛擬地址空間、數據棧、寄存器以及文件描述符等,這使得進程間相互隔離,一個進程的崩潰通常不會直接影響其他進程。
Linux 中常用 ps, top, htop 等命令查看和管理進程 。進程間通信(IPC)需要特殊的機制,如管道、消息隊列、共享內存、信號量等 。
🔍 線程 (Thread)
線程是進程內部的一個執行序列,是 CPU調度和執行的基本單位 。一個進程可以包含多個線程,所有這些線程共享進程的絕大部分資源,如代碼段、數據段、打開的文件描述符和信號處理等 。但它們也擁有自己獨立的棧空間和寄存器等少量必要資源以保證控制的相對獨立性。
由於共享相同的地址空間,線程間通信非常高效,可以直接通過讀寫共享內存進行數據交換。但也正因如此,線程同步(如使用互斥鎖 mutex、條件變量 condition variable)顯得至關重要,以避免競態條件(Race Condition)和數據不一致 。
在 Linux 中,線程通常通過 POSIX 線程庫(pthreads)進行創建和管理 。
1.2作業
在 Linux 命令行環境中,作業(Job) 是一種特殊的管理機制,它允許用户在同一個終端會話(Shell Session)內管理多個運行中的命令或程序。這個機制就是作業控制 (Job Control)。
1.2.1 什麼是作業 (Job)?
定義:
- 作業 是指在 Shell 環境中由用户啓動的一個或多個命令的集合。
- 它主要用於區分和控制當前終端會話中的前台(Foreground) 任務和後台(Background) 任務。
- 一個作業可以由單個命令組成,也可以由通過管道(
|)連接的多個命令組成。
1.2.2 核心概念:前台與後台
Linux 作業控制的核心是區分任務是在前台運行還是在後台運行。
前台作業 (Foreground Job)
-
特點:
- 獨佔終端: 任務運行時,終端被阻塞,用户無法輸入或執行其他命令。
- 接收輸入: 可以直接接收來自鍵盤的輸入(如
Ctrl + C中斷)。
- 啓動方式: 直接輸入命令並回車運行。
後台作業 (Background Job)
-
特點:
- 不獨佔終端: 任務在後台執行,終端立即返回提示符,用户可以繼續輸入和執行其他命令。
- 不接收輸入: 通常不接收鍵盤輸入(除非使用特定命令)。
- 啓動方式: 在命令的末尾添加一個
&符號。
2.圖形化監控與管理
2.1. Grafana + Prometheus
多機集羣,雲,AI平台推薦
Prometheus
- Prometheus 是一個開源的監控和報警系統,專門為雲原生環境設計,能夠高效地收集和存儲時序數據。
- 數據來源:Prometheus 通過 HTTP 請求從目標系統收集數據,並存儲在時序數據庫中。
- 報警機制:可以通過 Alertmanager 配置告警規則,及時向管理員發送警告。
Grafana
- Grafana 是一個開源的分析和可視化平台,支持與 Prometheus、InfluxDB 等多種數據源集成,提供強大的圖形化面板和告警功能。
- 優勢:Grafana 提供了豐富的可視化功能,可以通過圖表、表格、熱力圖等形式來展示系統的各項監控數據。
安裝 Prometheus
# 安裝 Prometheus
sudo apt-get install prometheus -y
安裝 Grafana
# 1. 下載 GPG 密鑰文件
wget -q -O - https://apt.grafana.com/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/grafana.gpg
# 2. 添加 Grafana Stable 倉庫到 sources.list.d 目錄
echo "deb [signed-by=/usr/share/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
# 3. 更新軟件包索引
sudo apt update -y
# 4.安裝grafana
sudo apt install grafana -y
- 啓動 Grafana 服務:
# 刷新服務重載
sudo systemctl daemon-reload
# 啓動服務
sudo systemctl start grafana-server
# 開機啓動
sudo systemctl enable grafana-server
# 驗證狀態
systemctl status grafana-server
-
啓動prometheus服務:
# 啓動服務 sudo systemctl start prometheus # 開機啓動 sudo systemctl enable prometheus # 驗證狀態 systemctl status prometheus - 訪問 Grafana Web 界面:
http://localhost:3000(默認端口為 3000)
登錄後,請求輸入新密碼:點skip跳過。
- 添加 Prometheus 作為數據源,配置圖表、儀表盤等可視化內容。
點擊左上角,添加connections,添加數據源
打開如下頁面
點擊add connection,在一系列源中,選擇prometheus,這裏可以輸入這個名字過濾
點擊下圖的add new data source ,右上角
輸入相關信息
上面的Localhost也可以換成本機IP地址。
託動頁面到底部,點save保存即可。
這些如何使用,需要大家自己再去深入學習了
下面是創建鏈接時,可以使用的默認指標值
2.2. Cockpit
單機監控和管理推薦
- Cockpit 是一個輕量級的 Web 管理界面,適用於管理 Linux 系統,支持實時監控系統性能、日誌、服務等。
-
特點:
- 易於安裝和使用。
- 提供圖形化的系統監控界面,可以實時查看 CPU、內存、磁盤、網絡等的狀態。
- 支持多主機管理,可以同時監控多個服務器。
Cockpit 安裝
先停掉prometheus(因為其端口用的也是9090)
sudo systemctl disable prometheus
sudo systemctl stop prometheus
安裝cockpit
# 安裝 Cockpit
sudo apt-get install cockpit -y
# 啓動
sudo systemctl start cockpit
# 開機自啓
sudo systemctl enable cockpit
訪問 Cockpit
通過 http://localhost:9090(默認端口 9090)來訪問 Cockpit Web 界面。
輸入我們的電腦用户名:kylinos;密碼:1,點擊登錄
Cockpit 使用
- 登錄後,你可以看到 CPU、內存、磁盤、網絡等各類系統資源的實時監控。
- 還支持查看日誌、管理用户、啓動/停止服務等功能。
2.3 系統自帶的任務管理器
右擊任務欄,或點擊開始菜單,選擇系統監視器
可以查看基本信息
3.命令行監控與管理
3.1. top / htop 命令
top 命令
top # 啓動 top,顯示實時的系統監控信息
top -u root # 顯示 root 用户的所有進程
top -p 1234 # 顯示 PID 為 1234 的進程
top -c # 顯示進程的完整命令行
top -d 2 # 每 2 秒刷新一次
top -i # 忽略空閒進程,僅顯示活動進程
top -s +%CPU # 按 CPU 使用率升序排列
top -s -%MEM # 按內存使用量降序排列
top -H # 顯示線程(而非進程)信息
top -E h # 使用人類可讀的內存格式(如 MB、GB)
htop 命令
htop # 啓動 htop,顯示進程和資源使用情況
htop -u root # 顯示 root 用户的進程
htop -d 2 # 設置刷新時間間隔為 2 秒
htop -p 1234 # 僅顯示 PID 為 1234 的進程
htop --no-color # 禁用顏色顯示
htop --sort-key PERCENT_CPU # 按 CPU 使用率排序
htop --sort-key PERCENT_MEM # 按內存使用率排序
htop -s cpu # 按 CPU 佔用排序
htop -C # 顯示 CPU 核心的詳細使用情況
htop --tree # 按樹形結構查看進程
3.2. ps 命令
ps aux # 查看所有進程
ps -ef # 查看所有進程的詳細信息
ps -u root # 查看 root 用户的進程
ps -C sshd # 查看名為 sshd 的進程
ps -p 1234 # 查看 PID 為 1234 的進程
ps --sort=-%mem # 按內存使用量降序排序
ps --sort=-%cpu # 按 CPU 使用量降序排序
ps -o pid,comm,%cpu,%mem # 自定義輸出格式,顯示 PID、命令、CPU 和內存
ps ax | grep <process_name> # 查找進程名稱中包含指定字符串的進程
ps -eo pid,uid,cmd # 顯示進程的 PID、UID 和命令行
3.3. vmstat 命令
vmstat 1 # 每秒鐘輸出一次系統狀態信息
vmstat 2 5 # 每 2 秒輸出一次,共輸出 5 次
vmstat -s # 顯示內存、虛擬內存、進程等詳細統計信息
vmstat -d # 顯示磁盤 I/O 的統計信息
vmstat -p # 顯示分頁相關的統計信息
vmstat -t # 顯示時間戳
vmstat 1 10 # 每秒輸出一次,輸出 10 次
vmstat -a # 顯示內存的活動和空閒情況
vmstat -m # 顯示內存的塊信息
vmstat 1 20 | grep swap # 輸出 swap 使用信息
3.4. iostat 命令
iostat # 顯示所有設備的平均 I/O 使用情況
iostat -x 1 # 每秒顯示一次設備的詳細 I/O 信息
iostat -d 2 # 每 2 秒刷新一次磁盤 I/O 性能數據
iostat -p sda # 顯示 /dev/sda 的 I/O 性能
iostat -c 1 # 每秒輸出一次 CPU 使用情況
iostat -t # 顯示磁盤 I/O 和時間戳
iostat -x 1 10 # 每秒輸出一次,輸出 10 次
iostat -z # 顯示空閒設備信息
iostat -m # 顯示以 MB 為單位的性能數據
iostat -n # 顯示網絡接口的統計信息
3.5. netstat 命令
netstat -tuln # 顯示所有監聽的端口
netstat -an # 顯示所有網絡連接,包含本地和遠程地址
netstat -r # 顯示路由表信息
netstat -p # 顯示進程和端口綁定的關係
netstat -i # 顯示網絡接口的統計信息
netstat -s # 顯示網絡協議的統計信息
netstat -l # 顯示所有監聽端口的狀態
netstat -t # 顯示所有 TCP 連接的狀態
netstat -u # 顯示所有 UDP 連接的狀態
netstat -c # 每秒刷新一次顯示網絡連接
3.6. sar 命令
sar -u 1 5 # 每秒輸出一次 CPU 使用情況,輸出 5 次
sar -r 1 5 # 每秒輸出一次內存使用情況,輸出 5 次
sar -n DEV 1 5 # 每秒輸出一次網絡接口的使用情況
sar -d 1 5 # 每秒輸出一次磁盤設備的 I/O 性能
sar -q # 顯示隊列長度的統計信息
sar -b # 顯示緩衝區的使用情況
sar -B # 顯示交換空間的統計信息
sar -v # 顯示系統版本信息
sar -p # 顯示進程的狀態
sar -f /var/log/sa/sa01 # 查看指定日期的歷史數據
7. dstat 命令
dstat # 顯示所有系統資源的實時使用情況
dstat -cdng # 顯示 CPU、磁盤、網絡和頁交換使用情況
dstat -t # 顯示時間戳
dstat -r # 顯示磁盤的讀寫情況
dstat -m # 顯示內存使用情況
dstat -n # 顯示網絡的實時流量
dstat -p # 顯示進程的 CPU 使用情況
dstat -l # 顯示系統的負載情況
dstat -g # 顯示進程生成/銷燬的數量
dstat -s # 顯示系統狀態摘要
3.8. uptime 命令
uptime # 查看系統運行時間、負載等信息
uptime -p # 顯示系統運行時間(例如:up 10 days, 3:21)
uptime -s # 顯示系統的啓動時間
uptime -V # 顯示 uptime 命令的版本
uptime -w # 顯示負載均衡的數據(此選項已過期)
3.9. smartctl 命令
smartctl -a /dev/sda # 查看磁盤的 S.M.A.R.T. 狀態
smartctl -t short /dev/sda # 執行短時間 S.M.A.R.T. 測試
smartctl -t long /dev/sda # 執行長時間 S.M.A.R.T. 測試
smartctl -x /dev/sda # 獲取更詳細的 S.M.A.R.T. 數據
smartctl -H /dev/sda # 檢查磁盤健康狀態
smartctl -l selftest /dev/sda # 顯示磁盤自檢記錄
smartctl -s on /dev/sda # 啓用磁盤的 S.M.A.R.T. 功能
smartctl -s off /dev/sda # 禁用磁盤的 S.M.A.R.T. 功能
smartctl -a /dev/sdb # 查看另一個磁盤的狀態
smartctl -S /dev/sda # 顯示磁盤的電源狀態
3.10. journalctl 命令
journalctl # 查看所有的系統日誌
journalctl -u sshd # 查看 sshd 服務的日誌
journalctl -f # 實時查看日誌輸出
journalctl -p err # 顯示所有錯誤級別的日誌
journalctl --since "2023-10-01" # 查看指定日期後的日誌
journalctl --
3.11. 作業命令
在 Linux 系統中,作業(Job)指的是在當前終端中運行的進程。通過作業相關的命令,你可以管理這些進程,包括在後台運行、暫停、恢復、結束等。以下是 Linux 中與作業管理相關的命令和它們的使用示例:
3.111. bg - 將作業放入後台運行
bg 命令用於將停止的作業(使用 Ctrl+Z 停止的作業)恢復到後台繼續運行。
-
假設你有一個正在運行但被暫停的進程(比如一個
sleep命令):sleep 1000 # 運行 sleep 命令,假設你按下了 Ctrl+Z 暫停它 -
使用
bg恢復該作業並將其放入後台運行:bg %1 # 其中 %1 是作業編號,表示恢復第 1 個作業 -
如果沒有指定作業編號,
bg會將最近停止的作業放入後台:bg
3.11.2. fg - 將作業帶回前台運行
fg 命令用於將後台運行的作業帶回前台繼續運行,通常用於與 bg 命令相對使用。
-
如果你之前有一個後台進程(如通過
bg放入後台的sleep命令),你可以通過以下命令將它帶回前台:fg %1 # 將作業編號為 1 的作業帶回前台 -
如果沒有指定作業編號,
fg會將最近的後台作業帶回前台:fg
3.11.3. jobs - 查看當前作業
jobs 命令用於顯示當前終端下的所有作業狀態,包括它們的編號、狀態和命令。
-
列出所有當前作業的狀態:
jobs -
輸出示例:
[1]+ 1234 Stopped sleep 1000 [2] 1235 Running sleep 1000 &Stopped:表示進程被暫停。Running:表示進程在後台運行。
3.11.4. kill - 終止作業
kill 命令用於終止一個作業,通常通過進程號(PID)來指定,或者通過作業編號來指定。
-
通過進程號(PID)終止作業:
kill 1234 # 終止 PID 為 1234 的進程 -
通過作業編號終止作業:
kill %1 # 終止作業編號為 1 的作業 -
強制終止作業:
kill -9 %1 # 強制終止作業編號為 1 的作業
3.11.5. nohup - 在後台運行命令並忽略掛起信號
nohup(No Hang Up)命令用於讓一個命令在退出 shell 後繼續運行,通常用於需要長期運行的作業(如腳本、服務等)。
-
使用
nohup啓動一個後台進程,並將輸出重定向到文件:nohup long_running_process > output.log 2>&1 & -
解釋:
nohup:使命令在 shell 關閉後仍然運行。&:將命令放到後台。> output.log 2>&1:將標準輸出和標準錯誤重定向到output.log文件。
3.11.6. disown - 從 shell 作業表中移除作業
disown 命令用於從當前 shell 會話的作業表中移除一個作業,這樣該作業就不再與當前 shell 關聯,通常與後台運行作業配合使用。
-
將某個後台作業從作業表中移除:
disown %1 # 移除作業編號為 1 的作業 -
如果不指定作業編號,
disown會移除當前後台作業:disown這時,該作業就不會在 shell 退出時被殺死,它會繼續在後台運行。
3.11.7. at - 延時執行命令
at 命令用於安排在指定時間執行一個命令,通常用於定時作業或延遲執行。
-
使用
at在當前時間 1 分鐘後執行一個命令:echo "sleep 1000" | at now + 1 minute -
你也可以在特定的時間點執行:
echo "echo 'Hello, World!'" | at 14:00 # 每天 14:00 執行 -
查看已安排的作業:
atq -
刪除某個作業:
atrm 1 # 刪除作業編號為 1 的作業
3.11.8. cron - 定時任務
cron 是 Linux 中用於定時執行作業的服務,適用於定期執行任務。
-
編輯
cron作業:crontab -e # 編輯當前用户的定時任務 -
在
crontab文件中添加任務,例如每天午夜執行一個腳本:0 0 * * * /path/to/script.sh -
查看當前用户的
cron作業:crontab -l -
刪除當前用户的所有
cron作業:crontab -r
3.11.9. time - 測量命令執行時間
time 命令用於測量一個命令執行所需的時間,通常用於性能調試。
-
測量命令的執行時間:
time sleep 5輸出示例:
real 0m5.003s user 0m0.000s sys 0m0.002sreal:實際經過的時間。user:在用户態運行的時間。sys:在內核態運行的時間。
3.11.10. wait - 等待作業完成
wait 命令用於等待後台作業的結束,並返回其退出狀態。
-
使用
wait等待後台作業完成:sleep 5 & wait $! # 等待最後一個後台作業完成這裏,
$!獲取最近一個後台作業的進程號。
寫在最後
本篇主要目標是告訴大家怎麼查看本機的進程狀態和一些指標信息
麒麟操作系統,從入門到精通
麒麟操作系統專欄:https://segmentfault.com/blog/kylinos
麒麟操作系統x64專欄:https://segmentfault.com/blog/kylinos-x64
B站視頻地址:https://www.bilibili.com/list/243784204
個人主頁:
https://segmentfault.com/u/code4world/articles
https://twitter.com/xiaohelong
https://github.com/xiaohelong
聯繫郵箱:1179611323@qq.com
羣:662512340
發行日志:
20251108 首發