一些雜亂的基礎概念 程式是一種靜態的文件,躺在磁碟上。而進程則是將程式運行起來放置於記憶體中。因此進程就是運行中的程式,是程式運行起來的一個實例。同一個程式可以運行為多個進程/實例。 進程之間有父子關係,即父進程與子進程之間的關係。父進程結束後,子進程也會隨之結束。因此,當我們通過終端連接上之後,隨即 ...
一些雜亂的基礎概念
程式是一種靜態的文件,躺在磁碟上。而進程則是將程式運行起來放置於記憶體中。因此進程就是運行中的程式,是程式運行起來的一個實例。同一個程式可以運行為多個進程/實例。
進程之間有父子關係,即父進程與子進程之間的關係。父進程結束後,子進程也會隨之結束。因此,當我們通過終端連接上之後,隨即啟用了一個與終端相關的shell進程(如bash),我們在該終端中運行的任何程式,都是這個終端的子進程。因此當我們在終端中運行一個需要長時間執行的程式,還未運行完畢便退出終端的話,那麼該長時間運行的程式也會自動結束掉的。
進程一般通過一些系統調用來創建,例如進程通過fork()或者clone()來複制自身創建新進程。
CentOS 6上最上層的進程是init進程,CentOS 7上最上層的進程是systemd進程。在一些情況下,父進程結束後,子進程還會存在,這類子進程被稱為孤兒進程(orphan process),它們會被init/systemd進程所“收養”。
進程有優先順序的概念,優先順序越低的進程可以享受越多的CPU資源。無法直接調整進程的優先順序,只能通過調整進程的nice值來改變,nice值越高進程優先順序越高(優先順序高越不優先)。可以理解為越高的nice值表示進程更願意占用更少的CPU資源。普通用戶只可以調高自身進程的nice值,只有root用戶才可以隨意調整nice值。
關於記憶體的一些基本概念,例如物理記憶體、虛擬記憶體、記憶體分頁和多級分頁表,推薦閱讀【Linux的記憶體分頁管理 - Vamei - 博客園】。
進程間通信
- 主機內部。
- signal(信號)。
- shm(SHared Memory,共用記憶體)。
- semaphore(信號量)。
- 主機之間。
- RPC(Remote Procedure Call,遠程過程調用)。
- socket。
進程類型
守護進程(daemon):一般是作為服務類的進程運行於系統後臺,與終端無關。一般是隨系統啟動的時候啟動,也可以在系統啟動後在終端手動啟動,啟動後會自動進入系統後臺。例如常見的httpd、nginx和mysqld等服務。
前臺進程:運行與前臺的進程,與終端相關,如果需要一段運行時間的話,會占用終端。例如我們基於php-cli工具手工運行一些php腳本。
進程根據占用資源的類型還可以分為CPU密集型(CPU-Bound)和IO密集型(IO-Bound)。
進程狀態
- 運行態:running。
- 就緒態:ready。
- 睡眠態:分為兩種,可中斷(interruptable)睡眠和不可中斷(uninterruptable)睡眠。不可中斷的睡眠一般是由於進程在等待IO處理。
- 停止態:stopped,處於記憶體中停止的狀態,不會占用CPU資源,除非手動啟動。
- 僵死態:zombie,類似進程卡死吧,是一種不好的狀態。
init進程
在Linux系統中,操作系統在啟動過程中如何一步步啟動進程,系統如何管理進程與服務,這些都與一個初始化進程相關,那就是init進程。它一般是OS中最先啟動的進程,一般PID為0。在不同的CentOS版本中其對應的init進程不一樣。
目前大多數主流的Linux發行版採用Systemd方案。
命令
pstree
pstree用於以樹狀的形式顯示當前的進程。
[root@C7 ~]# pstree systemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager─┬─dhclient │ └─2*[{NetworkManager}] ├─VGAuthService ├─2*[abrt-watch-log] ├─abrtd ├─accounts-daemon───2*[{accounts-daemon}] ├─alsactl ├─at-spi-bus-laun─┬─dbus-daemon │ └─3*[{at-spi-bus-laun}] ├─at-spi2-registr───2*[{at-spi2-registr}] ├─atd ├─auditd─┬─audispd─┬─sedispatch │ │ └─{audispd} │ └─{auditd} ├─avahi-daemon───avahi-daemon ├─bluetoothd ├─colord───2*[{colord}] ├─crond ├─cupsd ├─2*[dbus-daemon] ├─dbus-launch ├─dnsmasq───dnsmasq ├─firewalld───{firewalld} ├─gdm─┬─X───5*[{X}] │ ├─gdm-session-wor─┬─gnome-session-b─┬─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}] │ │ │ │ │ ├─ibus-engine-sim───2*[{ibus-engine-sim}] │ │ │ │ │ └─2*[{ibus-daemon}] │ │ │ │ └─20*[{gnome-shell}] │ │ │ ├─gsd-a11y-keyboa───3*[{gsd-a11y-keyboa}] │ │ │ ├─gsd-a11y-settin───3*[{gsd-a11y-settin}] │ │ │ ├─gsd-clipboard───2*[{gsd-clipboard}] │ │ │ ├─gsd-color───3*[{gsd-color}] │ │ │ ├─gsd-datetime───2*[{gsd-datetime}] │ │ │ ├─gsd-housekeepin───2*[{gsd-housekeepin}] │ │ │ ├─gsd-keyboard───3*[{gsd-keyboard}] │ │ │ ├─gsd-media-keys───3*[{gsd-media-keys}] │ │ │ ├─gsd-mouse───2*[{gsd-mouse}] │ │ │ ├─gsd-power───3*[{gsd-power}] │ │ │ ├─gsd-print-notif───2*[{gsd-print-notif}] │ │ │ ├─gsd-rfkill───2*[{gsd-rfkill}] │ │ │ ├─gsd-screensaver───2*[{gsd-screensaver}] │ │ │ ├─gsd-sharing───3*[{gsd-sharing}] │ │ │ ├─gsd-smartcard───4*[{gsd-smartcard}] │ │ │ ├─gsd-sound───3*[{gsd-sound}] │ │ │ ├─gsd-wacom───2*[{gsd-wacom}] │ │ │ ├─gsd-xsettings───3*[{gsd-xsettings}] │ │ │ └─3*[{gnome-session-b}] │ │ └─2*[{gdm-session-wor}] │ └─3*[{gdm}] ├─gssproxy───5*[{gssproxy}] ├─ibus-portal───2*[{ibus-portal}] ├─ibus-x11───2*[{ibus-x11}] ├─irqbalance ├─ksmtuned───sleep ├─libvirtd───16*[{libvirtd}] ├─lsmd ├─lvmetad ├─master─┬─pickup │ └─qmgr ├─packagekitd───2*[{packagekitd}] ├─polkitd───5*[{polkitd}] ├─pulseaudio───2*[{pulseaudio}] ├─rngd ├─rpcbind ├─rsyslogd───2*[{rsyslogd}] ├─rtkit-daemon───2*[{rtkit-daemon}] ├─smartd ├─sshd─┬─sshd───bash───man───less │ └─sshd───bash───pstree ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tuned───4*[{tuned}] ├─udisksd───4*[{udisksd}] ├─upowerd───2*[{upowerd}] ├─vmtoolsd───{vmtoolsd} ├─wpa_supplicant └─xdg-permission-───2*[{xdg-permission-}]
對於相同的子進程,pstree會將其摺疊,並使用數字顯示其相同子進程數。例如。
init-+-getty |-getty |-getty `-getty
會被摺疊成。
init---4*[getty]
子進程的摺疊顯示使用的是方括弧,而子線程的摺疊顯示使用了方括弧與花括弧。
icecast2---13*[{icecast2}]
-c:如果想要取消摺疊(compact)功能的話,可使用該選項。
-p:預設情況下,pstree不會顯示PID,加上該選項可實現顯示PID功能。該選項暗含了-c選項(禁用摺疊)。
知道了PID之後,pstree可加上PID參數,用來顯示以某個PID為根的進程樹。
[root@C7 ~]# pstree -p 1214 tuned(1214)─┬─{tuned}(1541) ├─{tuned}(1542) ├─{tuned}(1543) └─{tuned}(1558)
-a:顯示進程的命令行選項參數等。使用該選項有時會因為命令行參數太長而無法顯全,可結合-l選項查看長格式。
├─dbus-daemon --fork --print-pid 5 --print-address 7 --session ├─dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
-h:高亮顯示當前進程以及祖先進程。
-H:高亮顯示指定PID進程以及祖先進程。
# pstree -H PID
-g:顯示進程的PGID(Process Group ID,進程組ID),我不懂什麼是進程組,從結果來看,子進程和進程的子線程的PGID等同於父進程的PID。同時顯示PID和PGID時,先顯示PID後顯示PGID。
-s:顯示進程的祖先進程。
[root@C7 ~]# pstree -p 1541 {tuned}(1541) [root@C7 ~]# pstree -sp 1541 systemd(1)───tuned(1214)───{tuned}(1541)
-u:顯示進程的用戶名(UID),如果有的話。知道用戶名以後,用戶名可作為命令參數來顯示與該用戶名相關的進程樹。
[root@C7 ~]# pstree -p postfix pickup(3311) qmgr(1401)
ps
ps命令用於顯示當前系統上的進程信息,也叫做當前進程快照(snapshot)。
它支持三種風格的選項:
- UNIX風格,選項可以被合併並且只能有一個連接號(-)。在man手冊中,UNIX風格,也叫做標準(standard)或者POSIX風格。
- BSD風格,選項可以被合併並且不能有連接號(-)。
- GNU長選項,必須有兩個連接號(-)。
由於ps有許多不同的版本,因此該版本(CentOS 7上的ps)為了相容性考慮,會存在許多功能相同的選項。不同風格的選項可以混合使用,但是可能會產生衝突,因此建議不要混合使用。
不同風格的選項名稱(字元)可能相同但不代表含義相同,例如以下2個命令,意義就不一樣。
# ps aux # ps -aux
雖然它們顯示的結果是相同的,下文會解釋。
選項組合一:aux
a:使ps列出所有和終端(tty)相關的進程,當和x選項共同使用的時候顯示所有的進程。
x:使ps列出所有和你(應該是當前的有效UID,Effective UID)相關的進程,當和x選項共同使用的時候顯示所有的進程。
u:以面向用戶的格式輸出。
a和x選項屬於簡單進程選取(SIMPLE PROCESS SELECTION)類選項。
u選項屬於輸出格式控制(OUTPUT FORMAT CONTROL)類選項。
因此該組合的作用是:以面向用戶的格式,BSD的風格顯示系統上所有的進程信息。
[root@C7 ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.2 0.4 191172 4168 ? Ss 10:03 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root 2 0.0 0.0 0 0 ? S 10:03 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 10:03 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 10:03 0:00 [kworker/0:0H] ... root 499 0.0 0.3 37376 3496 ? Ss 10:03 0:00 /usr/lib/systemd/systemd-journald root 528 0.0 0.1 124792 1320 ? Ss 10:03 0:00 /usr/sbin/lvmetad -f root 532 0.0 0.3 45648 3032 ? Ss 10:03 0:00 /usr/lib/systemd/systemd-udevd ... root 1495 0.0 1.8 320832 18444 tty1 Ssl+ 10:03 0:00 /usr/bin/X :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gdm-lKoaJ3/database -seat seat0 -nolist ... root 1949 0.0 0.3 116628 3256 pts/0 Ss 10:04 0:00 -bash root 1990 0.0 0.2 119788 2472 pts/0 S+ 10:05 0:00 man ps root 2003 0.0 0.0 110336 980 pts/0 S+ 10:05 0:00 less -s ...
我們再來看一下ps -aux的含義。
-a:選取除了會話首進程(session leader,相見getsid(2)的man手冊)和與終端無關的進程以外的所有進程。
-u:根據有效用戶ID(EUID)來選取進程。其後接的就是用戶名了。
因此,“-aux”的含義即選取滿足用戶名為“x”和-a選項條件的進程,如果不存在用戶x,那麼其效果等同於“aux”,這也就是為什麼在實際運行時,“ps aux”和“ps -aux”的結果是一樣的了。
接下來解釋幾個欄位的含義。
USER:進程所對應的用戶。
PID:進程ID。
%CPU:進程所占用的CPU百分比,占用的CPU時間/進程所運行的時間(cputime/realtime)。
%MEM:進程所占用的記憶體百分比。
VSZ:虛擬記憶體的大小,單位是KB。設備映射當前不包含;這點可能會改變。
RSS:Resident Size,常駐記憶體集,單位是KB。一個任務所使用到的非swap物理記憶體。
TTY:與進程所關聯的終端。
STAT:進程狀態。預設情況下,似乎進程的狀態只有在BSD風格的選項下才會被顯示。在UNIX風格的話,可能得通過-o來顯示了,並且使用了-o,就不可以使用其他UNIX風格的輸出格式控制了,例如-o和-f一起用是不行的。
- R:running,運行態。
- S:Interruptable Sleeping,可中斷睡眠態。
- D:Uninterruptable Sleeping,不可中斷睡眠態。進程處於等待的時候,可以理解為睡眠,如果進程是等待網路或者磁碟的IO,這種一般是必須等待完畢才可以繼續運行進程的,那麼這種是不可中斷的睡眠狀態,反之則為可中斷。
- T:Stopped,停止態。進程通過Ctrl+z調入後臺時處於該狀態。
- Z:Zombie,僵死態。進程等待被回收。
- +:前臺進程。
- l:多線程進程。
- N:低優先順序進程。具備nice值,對其他進程nice,因此這裡說的”優先順序“就真的是越低越不優先了。
- <:高優先順序進程。
- s:session leader,會話首進程。
START:進程所啟動的時間點。
TIME:進程所占用的CPU時間。
COMMAND:完整的命令行信息。
選項組合二:-ef
-e:選擇所有的進程,等同於-A。
-f:顯示長格式詳細信息。
[root@C7 ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 10:03 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root 2 0 0 10:03 ? 00:00:00 [kthreadd] root 3 2 0 10:03 ? 00:00:00 [ksoftirqd/0] root 5 2 0 10:03 ? 00:00:00 [kworker/0:0H] ... root 691 1 0 10:03 ? 00:00:00 /sbin/auditd root 693 691 0 10:03 ? 00:00:00 /sbin/audispd root 695 693 0 10:03 ? 00:00:00 /usr/sbin/sedispatch ... root 1495 1231 0 10:03 tty1 00:00:00 /usr/bin/X :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gdm-lKoaJ3/database -seat seat0 -nolisten tcp vt1 ... root 1949 1943 0 10:04 pts/0 00:00:00 -bash root 1990 1949 0 10:05 pts/0 00:00:00 man ps root 2003 1990 0 10:05 pts/0 00:00:00 less -s root 2017 1213 0 10:06 ? 00:00:00 sshd: root@pts/1 root 2023 2017 0 10:06 pts/1 00:00:00 -bash ...
UID:等同於ps aux輸出中的USER,進程的用戶。
PPID:該進程的父進程ID。
C:CPU的使用情況,等同於%CPU。
CMD:等同於COMMAND。
-f選項還可以結合其他的UNIX風格選項來增加額外的欄位信息。例如結合-L選項。
-L:顯示線程信息,NLWP表示線程數量,LWP表示線程ID。LWP的英文全稱是Light Weight Process,由此可見,線程即是輕量級的進程。
[root@C7 ~]# ps -efL | head -n 1 UID PID PPID LWP C NLWP STIME TTY TIME CMD [root@C7 ~]# ps -ef | grep "auditd" root 109 2 0 10:03 ? 00:00:00 [kauditd] root 691 1 0 10:03 ? 00:00:00 /sbin/auditd root 6178 2023 0 15:41 pts/1 00:00:00 grep --color=auto auditd [root@C7 ~]# ps -efL | grep "auditd" root 109 2 109 0 1 10:03 ? 00:00:00 [kauditd] root 691 1 691 0 2 10:03 ? 00:00:00 /sbin/auditd root 691 1 692 0 2 10:03 ? 00:00:00 /sbin/auditd root 6180 2023 6180 0 1 15:41 pts/1 00:00:00 grep --color=auto auditd
可見,原本/sbin/auditd只是一條進程信息,在顯示線程信息後,它顯示成了2條,PID相同,不過線程ID(LWP)不同。
選項組合三:-eFH
-F:基於-f選項,顯示比起更詳細的信息。
-H:以進程樹的格式顯示。
[root@C7 ~]# ps -eFH UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 2 0 0 0 0 0 10:03 ? 00:00:00 [kthreadd] root 3 2 0 0 0 0 10:03 ? 00:00:00 [ksoftirqd/0] root 5 2 0 0 0 0 10:03 ? 00:00:00 [kworker/0:0H] root 7 2 0 0 0 0 10:03 ? 00:00:00 [migration/0] root 8 2 0 0 0 0 10:03 ? 00:00:00 [rcu_bh] ... root 1 0 0 47793 4168 1 10:03 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root 499 1 0 9344 4028 0 10:03 ? 00:00:00 /usr/lib/systemd/systemd-journald root 528 1 0 31198 1320 2 10:03 ? 00:00:00 /usr/sbin/lvmetad -f root 532 1 0 11412 3032 1 10:03 ? 00:00:00 /usr/lib/systemd/systemd-udevd root 691 1 0 13877 900 2 10:03 ? 00:00:00 /sbin/auditd root 693 691 0 21138 936 0 10:03 ? 00:00:00 /sbin/audispd root 695 693 0 13899 1416 0 10:03 ? 00:00:00 /usr/sbin/sedispatch ...
SZ:進程的core image的物理頁(page)大小。包含文本、數據和棧空間(stack space)。設備映射當前不包含;這點可能會改變。
PSR:進程目前在哪個CPU核心上運行。
選項組合四:-eo,axo
o, -o, --format:輸出格式的一種格式,可以讓用戶自定義顯示欄位信息。欄位信息是一個列表,以逗號或者空格分隔,一般以逗號。欄位信息使用關鍵詞(keyword)來表示,關鍵詞除了可用於-o選項顯示欄位信息外,還可用於--sort選項來分類排序。例如。
[root@C7 ~]# ps -eo pid,user,args --sort user | head PID USER COMMAND 731 avahi avahi-daemon: running [C7.local] 746 avahi avahi-daemon: chroot helper 1726 colord /usr/libexec/colord 744 dbus /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation 1512 gdm /usr/libexec/gnome-session-binary --autostart /usr/share/gdm/greeter/autostart 1518 gdm dbus-launch --exit-with-session /usr/libexec/gnome-session-binary --autostart /usr/share/gdm/greeter/autostart 1519 gdm /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session 1526 gdm /usr/libexec/at-spi-bus-launcher 1531 gdm /bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
欄位名也可以置空或者根據需求重命名。如果全部置空的話,就不會顯示首行欄位名行了。
[root@C7 ~]# ps -eo pid,user=,args=mingling --sort user | head -n 3 PID mingling 731 avahi avahi-daemon: running [C7.local] 746 avahi avahi-daemon: chroot helper
欄位的寬度會自動調節,也可以在欄位名後面使用“:number”的形式來明確具體的寬度。
[root@C7 ~]# ps -eo uid:5,pid:10,ppid:30 UID PID PPID 0 1 0 0 2 0 0 3 2 0 5 2 0 7 2 0 8 2 ...
當選項使用情況比較複雜的時候,可以使用多個-o選項。
具體的欄位關鍵詞,在ps(1)的man手冊中的STANDARD FORMAT SPECIFIERS中有描述。
CODE HEADER DESCRIPTION %cpu %CPU cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running (cputime/realtime ratio), expressed as a percentage. It will not add up to 100% unless you are lucky. (alias pcpu). %mem %MEM ratio of the process's resident set size to the physical memory on the machine, expressed as a percentage. (alias pmem).
... ...
CODE:在CLI中需要輸入的關鍵詞。
HEADER:在輸出中顯示的首行欄位名稱。
DESCRIPTION:詳細的描述信息。
此前選項的輸出信息,如果某些欄位不明瞭,也是參考這部分的信息。
基於列表選取進程
上面所述的選項,在選取進程的時候,都是選擇某一類進程。例如-e、ax選項可選取所有進程等等。
除此之外還可基於列表,列表可以是用戶列表或者PID列表。
先來看基於用戶列表。
以不同的格式顯示有效UID和真實UID為postfix的進程。
-u:有效(effective)UID,即EUID。EUID用於文件訪問許可權的判斷。
-U:真實(real)UID,即RUID。RUID用戶識別創建進程的用戶。
[root@C7 ~]# ps -u postfix -U postfix -f UID PID PPID C STIME TTY TIME CMD postfix 1378 1374 0 11:04 ? 00:00:00 qmgr -l -t unix -u postfix 3325 1374 0 12:44 ? 00:00:00 pickup -l -t unix -u [root@C7 ~]# ps -u postfix -U postfix -F UID PID PPID C SZ RSS PSR STIME TTY TIME CMD postfix 1378 1374 0 22968 4096 3 11:04 ? 00:00:00 qmgr -l -t unix -u postfix 3325 1374 0 22951 4088 0 12:44 ? 00:00:00 pickup -l -t unix -u [root@C7 ~]# ps -u postfix -U postfix u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND postfix 1378 0.0 0.4 91872 4096 ? S 11:04 0:00 qmgr -l -t unix -u postfix 3325 0.0 0.4 91804 4088 ? S 12:44 0:00 pickup -l -t unix -u
在這個示例中,我們也看到了不同風格選項的使用。並且為了避免ps程式感到疑惑,我們將選項分開書寫,向下麵這個例子,就是寫在一起報錯了。
[root@C7 ~]# ps -uU postfix -F error: user name does not exist
既然說是列表了,那麼用戶名也可以多個。
[root@C7 ~]# ps -u postfix,colord,rtkit -f UID PID PPID C STIME TTY TIME CMD rtkit 732 1 0 11:04 ? 00:00:00 /usr/libexec/rtkit-daemon postfix 1378 1374 0 11:04 ? 00:00:00 qmgr -l -t unix -u colord 1727 1 0 11:04 ? 00:00:00 /usr/libexec/colord postfix 3325 1374 0 12:44 ? 00:00:00 pickup -l -t unix -u
再來看進程列表。
p PID_LIST -p PID_LIST --pid PID_LIST --ppid PID_LIST
[root@C7 ~]# ps -p 732,1378,1727,3325 -f UID PID PPID C STIME TTY TIME CMD rtkit 732 1 0 11:04 ? 00:00:00 /usr/libexec/rtkit-daemon postfix 1378 1374 0 11:04 ? 00:00:00 qmgr -l -t unix -u colord 1727 1 0 11:04 ? 00:00:00 /usr/libexec/colord postfix 3325 1374 0 12:44 ? 00:00:00 pickup -l -t unix -u
進程列表也可以只有一個PID,此情況下可以直接作為ps命令的參數。
# ps PID # ps -PID
這種適合於引用可返回PID的命令結果,例如pgrep。
[root@C7 ~]# ps -p $(pgrep systemd) PID TTY STAT TIME COMMAND 1 ? Ss 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 498 ? Ss 0:00 /usr/lib/systemd/systemd-journald 534 ? Ss 0:00 /usr/lib/systemd/systemd-udevd 744 ? Ss 0:00 /usr/lib/systemd/systemd-logind
也可以通過-C選項來實現同樣的功能。
-C cmdlist:根據命令名稱列表來匹配進程。
[root@C7 ~]# ps -C systemd,systemd-journald,systemd-udevd,systemd-logind -f UID PID PPID C STIME TTY TIME CMD root 1 0 0 11:04 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root 498 1 0 11:04 ? 00:00:00 /usr/lib/systemd/systemd-journald root 534 1 0 11:04 ? 00:00:00 /usr/lib/systemd/systemd-udevd root 744 1 0 11:04 ? 00:00:00 /usr/lib/systemd/systemd-logind
這裡的列表,既不支持glob,也不支持RE。而且它是精確匹配。
[root@C7 ~]# ps -C "systemd*" PID TTY TIME CMD [root@C7 ~]# ps -C "systemd.*" PID TTY TIME CMD [root@C7 ~]# ps -C "system" PID TTY TIME CMD
pgrep, pkill
pgrep基於pattern或者其他屬性查找進程,預設會輸出其PID。
pkill基於pattern或者其他屬性向進程發送信號(預設是SIGTERM),不會輸出進程信息。
# pgrep [options] pattern
# pkill [options] pattern
大部分選項是pgrep和pkill共用的,如果有專用,會單獨說明。
pgrep
為了做測試,我們安裝了一個apache httpd的服務。
# yum -y install httpd # systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: active (running) since Thu 2019-07-11 15:32:51 CST; 28min ago Docs: man:httpd(8) man:apachectl(8) Main PID: 5632 (httpd) Status: "Total requests: 10; Current requests/sec: 0; Current traffic: 0 B/sec" Tasks: 9 CGroup: /system.slice/httpd.service ├─5632 /usr/sbin/httpd -DFOREGROUND ├─5643 /usr/sbin/httpd -DFOREGROUND ├─5644 /usr/sbin/httpd -DFOREGROUND ├─5645 /usr/sbin/httpd -DFOREGROUND ├─5646 /usr/sbin/httpd -DFOREGROUND ├─5648 /usr/sbin/httpd -DFOREGROUND ├─5754 /usr/sbin/httpd -DFOREGROUND ├─5755 /usr/sbin/httpd -DFOREGROUND