2018-5-23進程及管理命令
運行態、就緒態、睡眠態、停止態、僵死態
,而睡眠態則可分為可中斷睡眠及不可中斷睡眠,這是根據其進程在CPU上的運行周期來決定其進程狀態,假設正在運行中的進程,而時間周期卻已經耗盡,那麽不管有多不情願都得先散場退居二線。一般來講可中斷睡眠是等待IO完成而被阻塞的進程,CPU運行速度很快,一旦指令進程用到數據時,如果要從磁盤上加載到內存中的話,CPU只能是白白的空轉,並創建子進程來處理,等待加載IO完成,那麽這個過程我們就稱之為等待IO完成過程,但CPU空轉對於系統來說是一種資源浪費,一旦某個進程遭遇阻塞,那麽內核讓其CPU其運行其它的進程指令,回過頭來,當那個子進程完成數據加載時,CPU就會暫時停止處理其它進行,而後則父進程銷毀子進程並且繼續運行。
那麽線程就是輕量級的進程,是進程的子單位,一個進程流可以生成多個線程,而多個線程可並行運行,從而該進程可運行的速度更快,但是前提是主機上一定要有多個CPU核心,否則會很麻煩,因為需要調度及切換,在切換過程中又浪費了大量的時間周期。
一、Linux進程管理工具
那麽我們在這一章節中開始講述Linux的管理工具,大約涉及的命令工具有:
pstree, ps, pidof, pgrep, top, htop, glances, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup, nice, renice, killall, ...
在RHEL
系列,無論是CentOS 5, 6, 7
的啟動方式以及管理進程的方式都不一樣。進程是運行程序的實體,內核都必須要管理進程,因為任何程序的運行都必須得接受內核管理,內核給進程創建了一個虛擬的空間,給出了除了該進程以及內核存在,任何一個進程,對於內核來說必須要進行追蹤,無論是創建及銷毀進程,都是由內核管理,不過內核其實並不想管理太多繁雜之事,對於用戶空間的請求,統一由一個進程來管理,稱之為init
,由它代理並向內核發起請求。
CentOS 5:SysV init CentOS 6:upstart CentOS 7:systemd /sbin/init
現在就開始介紹一些進程管理命令,第一個命令為
pstree
,該命令是對進程樹進行查看,那麽所看到系統的頂級進程對於不同的系統版本來講有可能是不一樣的,那麽在CentOS 7
中所看到的是systemd
進程,而對於CentOS 5,6
來說,其頂級進程為init
。pstree命令: pstree - display a tree process
那麽接下來命令為ps
命令,改命令就是將當前系統運行這一刻的狀態截取並顯示,不過只顯示命令這一刻一次所有的進程狀態。在用戶空間中,通過接口/proc/
偽文件系統,內核就將自己內部很多的狀態信息是通過/proc
輸出給用戶的。而這些狀態信息就是其內核的參數,一類是可設置的參數,用於改變內核運行特征,路徑在:/proc/sys
,而另外的一種為狀態參數,用於輸出內核統計的狀態信息,僅對用戶查看。為了能延續Linux哲學思想一切皆文件,所以將參數模擬成文件系統讓在用戶空間中供給用戶進行查看。而每一個proc
下的進程文件,都有一個目錄,以數字命名,這個數字就是PID
,存放著各種狀態信息。
ps命令: /proc/:內核中的狀態信息; 內核參數: 可設置其值從而調整內核運行特征的參數;/proc/sys/ 狀態變量:其用於輸出內核統計信息或狀態信息,僅用於查看; 參數:模擬成文件系統類型; 進程: /proc/#
那麽該命令的用法為:
ps - report a snapshot of the current processes. ps [options]
而對於選項來講,共有三種風格的選項:
選項有三種風格: 1 UNIX options, which may be grouped and must be preceded by a dash. 2 BSD options, which may be grouped and must not be used with a dash. 3 GNU long options, which are preceded by two dashes.
在我們啟動進程時,共有兩種方式,一種是通過終端啟動,另一種是無需通過終端來啟動,在系統啟動過程中自動啟動的程序,我們稱之為與終端無關的進程,而用戶通過終端啟動某一個程序載入內存讓其CPU運行為進程時,我們就稱之為與終端相關的進程。
啟動進程的方式: 系統啟動過程中自動啟動:與終端無關的進程; 用戶通過終端啟動:與終端相關的進程;
而我們可以使用一些選項用來查看與終端有關及無關的進程。
選項: a:所有與終端相關的進程; x:所有與終端無關的進程; u:以用戶為中心組織進程狀態信息顯示;
那麽接下來我們開始說一次該命令的常用組合。
常用組合之一:aux VZS:虛擬內存集; RSS:Resident Size,常駐內存集; STAT: R:running S: interrupdate sleeping D: uninterrupdate sleeping T: Stopped Z: zombie +:前臺進程; l:多線程進程; N:低優先級進程; <:高優先級進程; s:session leader;(會話引領者)
# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.6 128164 6824 ? Ss 14:35 0:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0.0 0.0 0 0 ? S 14:35 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 14:35 0:00 [ksoftirqd/0] root 1057 0.0 0.0 110044 828 tty1 Ss+ 14:36 0:00 /sbin/agetty --noclear tty1 linux root 1032 0.0 1.6 614636 16860 ? Ssl 14:36 0:00 /usr/sbin/libvirtd root 240 0.0 0.0 0 0 ? S< 14:35 0:00 [mpt_poll_0] root 601 0.0 0.1 16840 1016 ? SNs 14:35 0:00 /usr/sbin/alsactl -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfil root 7152 0.0 0.1 151064 1812 pts/0 R+ 20:39 0:00 ps aux
以上就是第一組選項組合方式,共有四種的組合方式,我們現在來說第二種。
選項: -e:顯示所有進程; -f:顯示完整格式的進程信息;
那麽對於常用組合之二,-ef
,為Unix風格。
# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 14:35 ? 00:00:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0 0 14:35 ? 00:00:00 [kthreadd] root 3 2 0 14:35 ? 00:00:01 [ksoftirqd/0] root 5 2 0 14:35 ? 00:00:00 [kworker/0:0H]
而常用組合之三為-efH
。
選項: -F:顯示完整格式的進程信息(與-f意義基本相同,不過顯示更加詳細); C: cpu utilzation(CPU利用率); PSR: 運行於那顆CPU之上; -H:以層級結構顯示進程的相關信息;
# ps -efH root 1 0 0 14:35 ? 00:00:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 354 1 0 14:35 ? 00:00:05 /usr/lib/systemd/systemd-journald root 381 1 0 14:35 ? 00:00:00 /usr/sbin/lvmetad -f root 391 1 0 14:35 ? 00:00:02 /usr/lib/systemd/systemd-udevd root 511 1 0 14:35 ? 00:00:00 /sbin/auditd root 513 511 0 14:35 ? 00:00:00 /sbin/audispd root 515 513 0 14:35 ? 00:00:00 /usr/sbin/sedispatch
而常用組合之四共有兩個,第一個-eo
,另一個為axo
。
常用組合之四:-eo o field1, field2, ...:自定義要顯示的字段列表,以逗號分隔; 常用的有:field: pid, ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio ni:nice值; priority:priority, 優先級; rtprio:real time; priority,實時優先級; axo
接下來介紹的命令為pgrep
和pkill
,從pgrep中看的出來,是做一個進程過濾的一個專用命令,而pkill是從過濾出的進程將其殺死關閉,根據其進程名字或其它信息來將其為進程發送信號,所以這兩個命令可以組合使用,使用格式都是一樣的,而使用格式為:
pgrep [options] pattern
該命令的選項為:
-u, uid:effective user -U, uid:read user -t, TERMAINAL:與指定的終端相關的進程; -l:顯示進程名; -a:顯示完整格式的進程名; -P, pid:顯示此進程的子進程;
下一個介紹的命令為pidof
命令,該命令是截取其進程的ID號的,輸入進程名,獲得其進程號。
pidof命令: 根據進程名,取其pid;
接下來所講的是top
命令,它所展示的類似於Windows的任務管理器,它是以動態方式來不斷刷新來查看其進程,數值從大到小逆序排序,默認為CPU進行排序。
top命令: top - display Linux processes 排序: P:以占據CPU百分比排序; M:以占據內存百分比排序; T:累計占用CPU時間排序; 首部信息: uptime:l命令; task及CPU信息:t命令; 內存信息:m命令; 退出命令:q 修改刷新時間間隔:s 終止指定的進程:k
該命令的選項為:
選項: -d #:指定刷新時間間隔,默認為3秒; -b:以批次方式顯示; -n:顯示多少批次;
uptime
命令就是跟top第一列上的信息作用幾乎無異,該命令為顯示系統時間,運行的時長以及平均負載(load average
)。而這個平均負載指的是過去一分鐘、五分鐘和十五分鐘的平均負載,而這個平均負載就是顯示等待運行的進程隊列的長度。
2018-5-23進程及管理命令