十一、监控和管理Linux进程
🎹 個人簡介:大家好,我是 金魚哥,CSDN運維領域新星創作者,華為云·云享專家,阿里云社區·專家博主
📚個人資質:CCNA、HCNP、CSNA(網絡分析師),軟考初級、中級網絡工程師、RHCSA、RHCE、RHCA、RHCI、ITIL😜
💬格言:努力不一定成功,但要想成功就必須努力🔥
🎈支持我:可點贊👍、可收藏??、可留言📝
本章節介紹如何監控和管理Linux進程。章節篇幅有點長,但希望能夠好好理解并熟練掌握,是日后工作進行排錯經常使用的知識點。
文章目錄
- 📜11.1 什么是進程
- 📑11.1.1 從windows的角度去看待進程
- 📑11.1.2 從linux的角度去看待進程
- 📜11.2 進程狀態
- 📑進程的基本狀態
- 📑進程更多的狀態:
- 📜11.3 進程管理和性能相關工具
- 📑11.3.1 進程樹 pstree
- 格式:
- 常用選項:
- 📑11.3.2 進程信息 ps
- ps格式
- 常用選項:
- ps 輸出屬性
- 常用組合:
- 📑11.3.3 查看進程信息prtstat
- 格式:
- 選項:
- 📑11.3.4 搜索進程
- 11.3.4.1 pgrep
- 11.3.4.2 pidof
- 📑11.3.5 負載查詢 uptime
- 📑11.3.6 查看進程實時狀態 top
- 📑11.3.7 RHEL8 新特性 cockpit
- 📑11.3.8 信號發送 kill
- 📑11.3.9 作業管理
- 💡總結
📜11.1 什么是進程
Process: 運行中的程序的一個副本,是被載入內存的一個指令集合,是資源分配的單位
- 進程ID(Process ID,PID)號碼被用來標記各個進程
- UID、GID、和SELinux語境決定對文件系統的存取和訪問權限
- 通常從執行進程的用戶來繼承
- 存在生命周期
進程創建:
- init:第一個進程,從 rhel7 以后為systemd
- 進程:都由其父進程創建,fork(),父子關系,CoW:Copy On Write(寫實復制)
進程是通過執行一個靜態程序而觸發的。靜態的程序觸發成一個動態的程序。
📑11.1.1 從windows的角度去看待進程
- 打開任務管理器,觀察狀態
-
打開運行C:\Windows\system32\cmd.exe
-
點擊箭頭擴展,然后運行一個命令,觀察
-
觀察進程對資源的使用
因此,進程是動態的
-
進程數量的統計
📑11.1.2 從linux的角度去看待進程
-
通過top命令,可以獲得動態的類任務管理器頁面
-
進程是通過運行一個靜態的可執行文件,從而生成的一個動態的進程
范例:
#第一個終端執行 [root@servera ~]# dd if=/dev/zero of=/dev/null #第二個終端執行 [root@servera ~]# ps aux | grep "dd if" root 6463 98.8 0.0 7324 820 pts/1 R+ 14:55 1:52 dd if=/dev/zero of=/dev/null root 6489 0.0 0.0 12108 1088 pts/2 R+ 14:57 0:00 grep --color=auto dd if -
進程的擁有者
進程在讀取或者寫入文件的時候,是采用這個擁有者的身份讀取和寫入的。所以針對需要讀取和寫入的這個擁有者必須要有權限。
- 通常情況下,進程的擁有者為執行者。
- 比如一些服務,通常進程的擁有者會在配置文件中指定為該服務的系統用戶
- GUID的二進制文件:/usr/bin/passwd
-
進程的資源占用量
- %cpu
- %mem
📜11.2 進程狀態
📑進程的基本狀態
- 創建狀態:進程在創建時需要申請一個空白PCB(process control block進程控制塊),向其中填寫
控制和管理進程的信息,完成資源分配。如果創建工作無法完成,比如資源無法滿足,就無法被調
度運行,把此時進程所處狀態稱為創建狀態 - 就緒狀態:進程已準備好,已分配到所需資源,只要分配到CPU就能夠立即運行
- 執行狀態:進程處于就緒狀態被調度后,進程進入執行狀態
- 阻塞狀態:正在執行的進程由于某些事件(I/O請求,申請緩存區失敗)而暫時無法運行,進程受
到阻塞。在滿足請求時進入就緒狀態等待系統調用 - 終止狀態:進程結束,或出現錯誤,或被系統終止,進入終止狀態。無法再執行
📑進程更多的狀態:
- 運行態R:running
- 睡眠態S\D:分為兩種,可中斷:interruptable,不可中斷:uninterruptable
- 停止態T:stopped,暫停于內存,但不會被調度,除非手動啟動
- 僵死態Z:zombie,僵尸態,結束進程,父進程結束前,子進程不關閉,殺死父進程可以關閉僵死
態 的子進程
范例:僵尸態
[root@servera ~]# bash [root@servera ~]# echo $BASHPID 3988 [root@servera ~]# dd if=/dev/zero of=/dev/null#再開一個終端,停止父進程bash,殺死dd進程,使其進入僵死態 [root@servera ~]# kill -19 3988 [root@servera ~]# kill -9 4018#方法1:恢復父進程 [root@servera ~]# kill -18 3988#方法2:殺死父進程 [root@servera ~]# kill -9 3988📜11.3 進程管理和性能相關工具
📑11.3.1 進程樹 pstree
pstree 可以用來顯示進程的父子關系,以樹形結構顯示
來自于psmisc包
格式:
pstree [OPTION] [ PID | USER ]常用選項:
-p 顯示PID -T 不顯示線程thread,默認顯示線程 -u 顯示用戶切換 -H pid 高亮指定進程及其前輩進程范例:
[root@servera ~]# pstree 1 systemd─┬─ModemManager───2*[{ModemManager}]├─NetworkManager───2*[{NetworkManager}]├─VGAuthService├─accounts-daemon───2*[{accounts-daemon}]├─alsactl├─atd├─auditd─┬─sedispatch│ └─2*[{auditd}]├─avahi-daemon───avahi-daemon├─bluetoothd├─chronyd├─colord───2*[{colord}][root@servera ~]# pstree user1 bash───ping[root@servera ~]# pstree | grep httpd|-httpd-+-httpd| |-2*[httpd---64*[{httpd}]]| `-httpd---80*[{httpd}] [root@servera ~]# pstree -u | grep httpd|-httpd-+-httpd(apache)| |-2*[httpd(apache)---64*[{httpd}]]| `-httpd(apache)---80*[{httpd}][root@servera ~]# pstree -p systemd(1)─┬─ModemManager(1002)─┬─{ModemManager}(1041)│ └─{ModemManager}(1054)├─NetworkManager(1172)─┬─{NetworkManager}(1177)│ └─{NetworkManager}(1178)├─VGAuthService(996)├─accounts-daemon(1097)─┬─{accounts-daemon}(1102)│ └─{accounts-daemon}(1108)范例:高亮顯示前輩進程
[root@servera ~]# pstree -pH 4207📑11.3.2 進程信息 ps
ps 即process state,可以進程當前狀態的快照,默認顯示當前終端中的進程,Linux系統各進程的相關
信息均保存在/proc/PID目錄下的各文件中
ps格式
ps [OPTION]...支持三種選項:
- UNIX選項 如: -A -e
- BSD選項 如: a
- GNU選項 如: --help
常用選項:
a 選項包括所有終端中的進程 x 選項包括不鏈接終端的進程 u 選項顯示進程所有者的信息 f 選項顯示進程樹,相當于 --forest k|--sort 屬性 對屬性排序,屬性前加 - 表示倒序 o 屬性… 選項顯示定制的信息 pid、cmd、%cpu、%mem L 顯示支持的屬性列表 -C cmdlist 指定命令,多個命令用,分隔 -L 顯示線程 -e 顯示所有進程,相當于-A -f 顯示完整格式程序信息 -F 顯示更完整格式的進程信息 -H 以進程層級格式顯示進程相關信息 -u userlist 指定有效的用戶ID或名稱 -U userlist 指定真正的用戶ID或名稱 -g gid或groupname 指定有效的gid或組名稱 -G gid或groupname 指定真正的gid或組名稱 -p pid 顯示指pid的進程 --ppid pid 顯示屬于pid的子進程 -t ttylist 指定tty,相當于 t -M 顯示SELinux信息,相當于Zps 輸出屬性
C : ps -ef 顯示列 C 表示cpu利用率 VSZ: Virtual memory SiZe,虛擬內存集,線性內存 RSS: ReSident Size, 常駐內存集 STAT:進程狀態 R:running S: interruptable sleeping D: uninterruptable sleeping T: stopped Z: zombie +: 前臺進程 l: 多線程進程 L:內存分頁并帶鎖 N:低優先級進程 <: 高優先級進程 s: session leader,會話(子進程)發起者 I:Idle kernel thread,新內核新特性(空閑線程) ni: nice值 pri: priority 優先級 rtprio: 實時優先級 psr: processor CPU編號常用組合:
aux -ef -eFH -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm范例:查看進程詳細信息
[root@servera ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 15:17 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 18 root 2 0 0 15:17 ? 00:00:00 [kthreadd] root 3 2 0 15:17 ? 00:00:00 [rcu_gp] root 4 2 0 15:17 ? 00:00:00 [rcu_par_gp] root 6 2 0 15:17 ? 00:00:00 [kworker/0:0H-kblockd][root@servera ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.7 180140 14504 ? Ss 15:17 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 18 root 2 0.0 0.0 0 0 ? S 15:17 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< 15:17 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I< 15:17 0:00 [rcu_par_gp] root 6 0.0 0.0 0 0 ? I< 15:17 0:00 [kworker/0:0H-kblockd] root 8 0.0 0.0 0 0 ? I< 15:17 0:00 [mm_percpu_wq] root 9 0.0 0.0 0 0 ? S 15:17 0:00 [ksoftirqd/0]范例:
#查看進程的父子關系 [root@servera ~]# ps auxf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2 0.0 0.0 0 0 ? S 15:17 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< 15:17 0:00 \_ [rcu_gp] root 4 0.0 0.0 0 0 ? I< 15:17 0:00 \_ [rcu_par_gp] root 6 0.0 0.0 0 0 ? I< 15:17 0:00 \_ [kworker/0:0H-kblockd] root 8 0.0 0.0 0 0 ? I< 15:17 0:00 \_ [mm_percpu_wq] root 9 0.0 0.0 0 0 ? S 15:17 0:00 \_ [ksoftirqd/0] root 10 0.0 0.0 0 0 ? I 15:17 0:00 \_ [rcu_sched] root 11 0.0 0.0 0 0 ? S 15:17 0:00 \_ [migration/0] root 12 0.0 0.0 0 0 ? S 15:17 0:00 \_ [watchdog/0]#查看進程的特定屬性 [root@servera ~]# ps axo pid,cmd,%mem,%cpuPID CMD %MEM %CPU1 /usr/lib/systemd/systemd -- 0.7 0.02 [kthreadd] 0.0 0.03 [rcu_gp] 0.0 0.04 [rcu_par_gp] 0.0 0.06 [kworker/0:0H-kblockd] 0.0 0.0范例:針對屬性排序,rhel6 以下版本不支持
#按CPU利用率倒序排序 [root@servera ~]# ps axo pid,cmd,%cpu,%mem k -%cpuPID CMD %CPU %MEM4568 dd if=/dev/zero of=/dev/nul 88.3 0.01 /usr/lib/systemd/systemd -- 0.0 0.72 [kthreadd] 0.0 0.03 [rcu_gp] 0.0 0.04 [rcu_par_gp] 0.0 0.06 [kworker/0:0H-kblockd] 0.0 0.0#按內存倒序排序 [root@servera ~]# ps axo pid,cmd,%cpu,%mem --sort -%memPID CMD %CPU %MEM1860 /usr/bin/gnome-shell 0.0 8.31900 /usr/bin/Xwayland :1024 -ro 0.0 3.21929 /usr/libexec/ibus-x11 --kil 0.0 3.11365 /usr/sbin/libvirtd 0.0 2.31073 /usr/libexec/platform-pytho 0.0 2.21070 /usr/libexec/sssd/sssd_nss 0.0 2.01187 /usr/libexec/platform-pytho 0.0 1.71975 /usr/libexec/gsd-xsettings 0.0 1.51983 /usr/libexec/gsd-color 0.0 1.4📑11.3.3 查看進程信息prtstat
可以顯示進程信息,來自于psmisc包
格式:
prtstat [options] PID ...選項:
-r raw 格式顯示范例:
[root@servera ~]# prtstat 1407 Process: httpd State: S (sleeping)CPU#: 0 TTY: 0:0 Threads: 1 Process, Group and Session IDsProcess ID: 1407 Parent ID: 1Group ID: 1407 Session ID: 1407T Group ID: -1Page FaultsThis Process (minor major): 1689 54Child Processes (minor major): 0 0 CPU TimesThis Process (user system guest blkio): 0.01 0.09 0.00 0.07Child processes (user system guest): 0.00 0.00 0.00 MemoryVsize: 288 MB RSS: 11 MB RSS Limit: 18446744073709 MBCode Start: 0x55b6fa9bb000 Code Stop: 0x55b6faa40f60Stack Start: 0x7fffc2b468a0Stack Pointer (ESP): 0 Inst Pointer (EIP): 0 SchedulingPolicy: normalNice: 0 RT Priority: 0 (non RT) [root@servera ~]# prtstat -r 1407pid: 1407 comm: httpdstate: S ppid: 1pgrp: 1407 session: 1407tty_nr: 0 tpgid: -1flags: 400100 minflt: 1689cminflt: 0 majflt: 54cmajflt: 0 utime: 1stime: 9 cutime: 0cstime: 0 priority: 20nice: 0 num_threads: 1itrealvalue: 0 starttime: 1054vsize: 288198656 rss: 2884rsslim: 18446744073709551615 startcode: 94244376915968endcode: 94244377464672 startstack: 140736459991200kstkesp: 0 kstkeip: 0wchan: 1 nswap: 0cnswap: 1 exit_signal: 17processor: 1 rt_priority: 0policy: 0 delayaccr_blkio_ticks: 7guest_time: 0 cguest_time: 0📑11.3.4 搜索進程
按條件搜索進程
- ps 選項 | grep ‘pattern’ 靈活
- pgrep 按預定義的模式
- /sbin/pidof 按確切的程序名稱查看pid
11.3.4.1 pgrep
命令格式
pgrep [options] pattern常用選項
-u uid: effective user,生效者 -U uid: real user,真正發起運行命令者 -t terminal: 與指定終端相關的進程 -l: 顯示進程名 -a: 顯示完整格式的進程名 -P pid: 顯示指定進程的子進程范例:
[root@servera ~]# pgrep -u user1 2593 2623 2657 [root@servera ~]# pgrep -lu user1 2593 bash 2623 bash 2657 ping#錯誤寫法,切記用戶選項在后 [root@servera ~]# pgrep -ul user1 pgrep: invalid user name: l[root@servera ~]# pgrep -au user1 2593 -bash 2623 bash[root@servera ~]# pgrep -aP 2623 2695 ping baidu.com[root@servera ~]# pgrep -at pts/1 2563 -bash 2592 su - user1 2593 -bash 2623 bash 2695 ping baidu.com11.3.4.2 pidof
命令格式
pidof [options] [program [...]]常用選項:
-x 按腳本名稱查找pid范例:
[root@servera ~]# pidof httpd 1928 1927 1926 1924 1407[root@servera ~]# vim ping.sh [root@servera ~]# chmod a+x ping.sh [root@servera ~]# ./ping.sh [root@servera ~]# pidof -x ping.sh 3076📑11.3.5 負載查詢 uptime
/proc/uptime 包括兩個值,單位 s
- 系統啟動時長
- 空閑進程的總時長(按總的CPU核數計算)
uptime 和 w 顯示以下內容
- 當前時間
- 系統已啟動的時間
- 當前上線人數
- 系統平均負載(1、5、15分鐘的平均負載,一般不會超過1,超過5時建議警報)
系統平均負載: 指在特定時間間隔內運行隊列中的平均進程數,通常每個CPU內核的當前活動進程數不大
于3,那么系統的性能良好。如果每個CPU內核的任務數大于5,那么此主機的性能有嚴重問題
📑11.3.6 查看進程實時狀態 top
top 提供動態的實時進程狀態
有許多內置命令
幫助:h 或 ? ,按 q 或esc 退出幫助
top命令欄位信息簡介
us:用戶空間 sy:內核空間 ni:調整nice時間 id:空閑 wa:等待IO時間 hi:硬中斷 si:軟中斷(模式切換) st:虛擬機偷走的時間top選項:
-d # 指定刷新時間間隔,默認為3秒 -b 全部顯示所有進程 -n # 刷新多少次后退出示例:
top -d 5 -n 5📑11.3.7 RHEL8 新特性 cockpit
Cockpit 是rhel 8 取入的新特性,是一個基于 Web 界面的應用,它提供了對系統的圖形化管理
- 監控系統活動(CPU、內存、磁盤 IO 和網絡流量)
- 查看系統日志條目
- 查看磁盤分區的容量
- 查看網絡活動(發送和接收)
- 查看用戶帳戶
- 檢查系統服務的狀態
- 提取已安裝應用的信息
- 查看和安裝可用更新(如果以 root 身份登錄)并在需要時重新啟動系統
- 打開并使用終端窗口
范例:安裝 cockpit
[root@servera ~]# dnf -y install cockpit [root@servera ~]# systemctl enable --now cockpit.socket [root@servera ~]# ss -altun(查看9090端口是否啟用)打開瀏覽器,訪問以下地址:
https://rhel8主機:9090📑11.3.8 信號發送 kill
kill:內部命令,可用來向進程發送控制信號,以實現對進程管理,每個信號對應一個數字,信號名稱以
SIG開頭(可省略),不區分大小寫
顯示當前系統可用信號:
kill -l trap -l查看幫助:man 7 signal
常用信號:
1) SIGHUP 無須關閉進程而讓其重讀配置文件 2) SIGINT 中止正在運行的進程;相當于Ctrl+c 3) SIGQUIT 相當于ctrl+\ 9) SIGKILL 強制殺死正在運行的進程 15) SIGTERM 終止正在運行的進程,默認信號 18) SIGCONT 繼續運行 19) SIGSTOP 后臺休眠指定信號的方法 :
- 信號的數字標識:1, 2, 9
- 信號完整名稱:SIGHUP,sighup
- 信號的簡寫名稱:HUP,hup
向進程發送信號:
按PID:
kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]范例
kill -1 pid … kill -n 9 pid kill -s SIGINT pid按名稱:killall 來自于psmisc包
killall可以直接使用信號控制進程,不需要查閱pid等信息
killall [-SIGNAL] comm…pkill=killall
范例:
[root@servera ~]# kill httpd -bash: kill: httpd: arguments must be process or job IDs [root@servera ~]# killall httpd [root@servera ~]# killall httpd httpd: no process found特殊信號:0信號
范例:利用 0 信號實現進程的健康性檢查
[root@servera ~]# killall -0 ping [root@servera ~]# killall ping [root@servera ~]# killall -0 ping ping: no process found#此方式有局限性,即使進程處于停止或僵尸狀態,此方式仍然認為是進程是健康的📑11.3.9 作業管理
Linux的作業控制
- 前臺作業:通過終端啟動,且啟動后一直占據終端
- 后臺作業:可通過終端啟動,但啟動后即轉入后臺運行(釋放終端)
讓作業運行于后臺
- 運行中的作業: Ctrl+z
- 尚未啟動的作業: COMMAND &
后臺作業雖然被送往后臺運行,但其依然與終端相關;退出終端,將關閉后臺作業。
如果希望送往后臺后,剝離與終端的關系:
- nohup COMMAND &>/dev/null &
查看當前終端所有作業:
jobs作業控制:
fg [[%]JOB_NUM]:把指定的后臺作業調回前臺 bg [[%]JOB_NUM]:讓送往后臺的作業在后臺繼續運行 kill [%JOB_NUM]: 終止指定的作業💡總結
RHCSA認證作為基礎認證,涉及的基礎內容需要大家好好進行學習并鞏固。有良好的基礎才能更上一層樓。
好好加油,可以噶🤪。
以上就是【金魚哥】對 第十一章 監控和管理Linux進程 的簡述和講解。希望能對看到此文章的小伙伴有所幫助。
💾紅帽認證專欄系列:
RHCSA專欄:戲說 RHCSA 認證
RHCE專欄:戲說 RHCE 認證
此文章收錄在RHCA專欄:RHCA 回憶錄
如果這篇【文章】有幫助到你,希望可以給【金魚哥】點個贊👍,創作不易,相比官方的陳述,我更喜歡用【通俗易懂】的文筆去講解每一個知識點。
如果有對【運維技術】感興趣,也歡迎關注?????? 【金魚哥】??????,我將會給你帶來巨大的【收獲與驚喜】💕💕!
總結
以上是生活随笔為你收集整理的十一、监控和管理Linux进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四、纹理显示图片
- 下一篇: Ventoy-超强装机神器,支持全部系统