Linux中的ps命令是Process Status的縮寫。ps命令用於報告當前系統的進程狀態,列出系統中當前運行的那些進程。可以搭配kill指令隨時中斷、刪除不必要的程序。
要對進程進行監測和控制,首先必須要了解當前進程的情況,而 ps 命令就是最基本同時也是非常強大的進程查看命令。使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等。總之大部分信息都是可以通過執行該命令得到的。
ps 為我們提供了進程的一次性的查看,也就是是當前那些進程的快照,它所提供的查看結果並不動態連續的;如果想對進程時間監控,應該用 top 工具。
kill 命令用於殺死進程。
linux上進程有5種狀態:
1. 運行(正在運行或在運行隊列中等待)
2. 中斷(休眠中, 受阻, 在等待某個條件的形成或接受到信號)
3. 不可中斷(收到信號不喚醒和不可運行, 進程必須等待直到有中斷發生)
4. 僵死(進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用后釋放)
5. 停止(進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號后停止運行運行)
ps工具標識進程的5種狀態碼(S):
D 不可中斷 uninterruptible sleep (usually IO)
R 運行 runnable (on run queue)
S 中斷 sleeping
T 停止 traced or stopped
Z 僵死 a defunct (”zombie”) process
語法:
ps(選項)
選項說明:
-a:顯示所有終端機下執行的程序,除了階段作業領導者之外。
a:顯示現行終端機下的所有程序,包括其他用戶的程序。
-A:顯示所有程序。
-c:顯示CLS和PRI欄位。
c:列出程序時,顯示每個程序真正的指令名稱,而不包含路徑,選項或常駐服務的標示。
-C<指令名稱>:指定執行指令的名稱,並列出該指令的程序的狀況。
-d:顯示所有程序,但不包括階段作業領導者的程序。
-e:此選項的效果和指定"A"選項相同。
e:列出程序時,顯示每個程序所使用的環境變量。
-f:顯示UID,PPIP,C與STIME欄位。
f:用ASCII字符顯示樹狀結構,表達程序間的相互關系。
-g<群組名稱>:此選項的效果和指定"-G"選項相同,當亦能使用階段作業領導者的名稱來指定。
g:顯示現行終端機下的所有程序,包括群組領導者的程序。
-G<群組識別碼>:列出屬於該群組的程序的狀況,也可使用群組名稱來指定。
h:不顯示標題列。
-H:顯示樹狀結構,表示程序間的相互關系。
-j或j:采用工作控制的格式顯示程序狀況。
-l或l:采用詳細的格式來顯示程序狀況。
L:列出欄位的相關信息。
-m或m:顯示所USER和WCHAN欄位。
-N:顯示所有的程序,除了執行ps指令終端機下的程序之外。
-p<程序識別碼>:指定程序識別碼,並列出該程序的狀況。
p<程序識別碼>:此選項的效果和指定"-p"選項相同,只在列表格式方面稍有差異。
r:只列出現行終端機正在執行中的程序。
-s<階段作業>:指定階段作業的程序識別碼,並列出隸屬該階段作業的程序的狀況。
s:采用程序信號的格式顯示程序狀況。
S:列出程序時,包括已中斷的子程序資料。
-t<終端機編號>:指定終端機編號,並列出屬於該終端機的程序的狀況。
t<終端機編號>:此選項的效果和指定"-t"選項相同,只在列表格式方面稍有差異。
-T:顯示現行終端機下的所有程序。
-u<用戶識別碼>:此選項的效果和指定"-U"選項相同。
u:以用戶為主的格式來顯示程序狀況。
-U<用戶識別碼>:列出屬於該用戶的程序的狀況,也可使用用戶名稱來指定。
U<用戶名稱>:列出屬於該用戶的程序的狀況。
v:采用虛擬內存的格式顯示程序狀況。
-V或V:顯示版本信息。
-w或w:采用寬闊的格式來顯示程序狀況。
x:顯示所有程序,不以終端機來區分。
X:采用舊式的Linux i386登陸格式顯示程序狀況。
-y:配合選項"-l"使用時,不顯示F(flag)欄位,並以RSS欄位取代ADDR欄位 。
-<程序識別碼>:此選項的效果和指定"p"選項相同。
--cols<每列字符數>:設置每列的最大字符數。
--columns<每列字符數>:此選項的效果和指定"--cols"選項相同。
--cumulative:此選項的效果和指定"S"選項相同。
--deselect:此選項的效果和指定"-N"選項相同。
--forest:此選項的效果和指定"f"選項相同。
--headers:重復顯示標題列。
--help:在線幫助。
--info:顯示排錯信息。
--lines<顯示列數>:設置顯示畫面的列數。
--no-headers:此選項的效果和指定"h"選項相同,只在列表格式方面稍有差異。
--group<群組名稱>:此選項的效果和指定"-G"選項相同。
--Group<群組識別碼>:此選項的效果和指定"-G"選項相同。
--pid<程序識別碼>:此選項的效果和指定"-p"選項相同。
--rows<顯示列數>:此選項的效果和指定"--lines"選項相同。
--sid<階段作業>:此選項的效果和指定"-s"選項相同。
--tty<終端機編號>:此選項的效果和指定"-t"選項相同。
--user<用戶名稱>:此選項的效果和指定"-U"選項相同。
--User<用戶識別碼>:此選項的效果和指定"-U"選項相同。
--version:此選項的效果和指定"-V"選項相同。
--widty<每列字符數>:此選項的效果和指定"-cols"選項相同。
常用示例:
1、顯示所有進程信息
命令:ps -A
[root@CTU1000094955 ~]# ps -A PID TTY TIME CMD 1 ? 00:20:52 systemd 2 ? 00:00:12 kthreadd 3 ? 00:00:00 ksoftirqd/0 5 ? 00:00:00 kworker/0:0H 7 ? 00:00:27 migration/0 8 ? 00:00:00 rcu_bh 9 ? 00:00:00 rcuob/0 ... ...#中間省略了部分 59785 ? 00:00:00 sshd 59795 pts/0 00:00:00 bash 60283 ? 00:00:00 kworker/1:2 60948 ? 00:00:00 kworker/2:2 62872 ? 00:00:00 kworker/0:1 64181 ? 00:00:01 setroubleshootd 64187 ? 00:00:00 sleep 64258 pts/0 00:00:00 ps 64259 ? 00:00:00 kworker/3:0 68591 ? 00:24:13 java 85204 ? 00:10:33 accounts-daemon 103598 ? 00:00:00 mysqld_safe 103762 ? 00:20:03 mysqld 120139 ? 00:00:14 kworker/u256:0 126191 ? 01:53:16 polkitd
2、顯示指定用戶信息
命令:ps -u root
[root@CTU1000094955 ~]# ps -u root PID TTY TIME CMD 1 ? 00:20:52 systemd 2 ? 00:00:12 kthreadd 3 ? 00:00:00 ksoftirqd/0 5 ? 00:00:00 kworker/0:0H 7 ? 00:00:27 migration/0 8 ? 00:00:00 rcu_bh 9 ? 00:00:00 rcuob/0 10 ? 00:00:00 rcuob/1 ... ... 中間省略了部分 59785 ? 00:00:00 sshd 59795 pts/0 00:00:00 bash 65450 ? 00:00:00 sleep 65521 pts/0 00:00:00 ps 68591 ? 00:24:15 java 85204 ? 00:10:33 accounts-daemon 103598 ? 00:00:00 mysqld_safe 120139 ? 00:00:14 kworker/u256:0
3、顯示所有進程信息,連同命令行
命令:ps -ef
[root@CTU1000094955 ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Oct04 ? 00:20:52 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0 0 Oct04 ? 00:00:12 [kthreadd] root 3 2 0 Oct04 ? 00:00:00 [ksoftirqd/0] root 5 2 0 Oct04 ? 00:00:00 [kworker/0:0H] root 7 2 0 Oct04 ? 00:00:27 [migration/0] ... ... 中間省略了部分 root 59785 25566 0 10:52 ? 00:00:00 sshd: root@pts/0 root 59795 59785 0 10:52 pts/0 00:00:00 -bash root 65870 861 0 11:15 ? 00:00:00 sleep 60 root 65915 59795 0 11:16 pts/0 00:00:00 ps -ef root 68591 1 0 Nov16 ? 00:24:15 /biz/maas/cmdp/jre/bin/java -Djava.util.logging.config.file=/biz/maas/cmdp/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apa root 85204 1 0 Oct30 ? 00:10:33 /usr/libexec/accounts-daemon root 103598 1 0 Oct30 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/CTU1000094955.pid mysql 103762 103598 0 Oct30 ? 00:20:06 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mariadb/maria root 120139 2 0 Nov11 ? 00:00:14 [kworker/u256:0] polkitd 126191 1 0 Oct10 ? 01:53:17 /usr/lib/polkit-1/polkitd --no-debug
4、ps 與grep 常用組合用法,查找特定進程
命令:ps -ef|grep ssh
[root@CTU1000094955 ~]# ps -ef|grep ssh root 25566 1 0 Oct31 ? 00:00:00 /usr/sbin/sshd -D root 59785 25566 0 10:52 ? 00:00:00 sshd: root@pts/0 root 66142 59795 0 11:18 pts/0 00:00:00 grep --color=auto ssh
5、將目前屬於您自己這次登入的PID與相關信息列示出來
命令:ps -l
[root@CTU1000094955 ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 59795 59785 0 80 0 - 30751 wait pts/0 00:00:00 bash 0 R 0 66798 59795 0 80 0 - 34861 - pts/0 00:00:00 ps
說明:
F 代表這個程序的旗標 (flag):4 代表此進程的權限為root;為1表示此子進程僅可進行復制(fork),而無法實際執行(exec)。
S 代表這個程序的狀態 (STAT),關於各 STAT 的含義已在上問題出。
UID 程序被該 UID 所擁有
PID 就是這個程序的 ID !
PPID 則是其上級父程序的ID
C CPU 使用的資源百分比
PRI/NI Priority /Nice的縮寫,代表此進程被CPU所執行的優先級,數值越小代表該進程越快被CPU執行
ADDR 這個是 kernel function,指出該程序在內存的那個部分。如果是個 running的程序,一般就是 "-"
SZ 使用掉的內存大小
WCHAN 目前這個程序是否正在運作當中,若為 - 表示正在運作
TTY 登陸者的終端機位置,若為遠程登錄則使用動態終端口(pts/n)
TIME 使用掉的 CPU 時間。是此進程實際花費CPU運行的時間,而不是系統時間。
CMD Command的縮寫,造成此程序的觸發進程的命令為何種命令
為何在預設的情況下, ps 僅會列出與目前所在的 bash shell 有關的 PID 而已,所以, 當我使用 ps -l 的時候,只有2個 PID。
6、列出目前所有的正在內存當中的程序
命令:ps aux
[root@CTU1000094955 ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 201588 13760 ? Ss Oct04 20:53 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0.0 0.0 0 0 ? S Oct04 0:12 [kthreadd] root 3 0.0 0.0 0 0 ? S Oct04 0:00 [ksoftirqd/0] ... ...中間省略了部分內容 root 68591 0.2 12.5 5609960 936952 ? Sl Nov16 24:18 /biz/maas/cmdp/jre/bin/java -Djava.util.logging.config.file=/biz/maas/cmdp/tomcat/conf/logging.properties -Djava.util.logging root 70812 0.0 0.0 116272 708 ? S 11:34 0:00 sleep 60 root 70892 0.0 0.0 141564 1692 pts/0 R+ 11:35 0:00 ps aux root 85204 0.0 0.0 384676 3780 ? Ssl Oct30 10:33 /usr/libexec/accounts-daemon root 103598 0.0 0.0 18084 1732 ? S Oct30 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/CTU1000094955.pid mysql 103762 0.0 6.4 2293168 478984 ? Sl Oct30 20:06 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/l root 120139 0.0 0.0 0 0 ? S Nov11 0:14 [kworker/u256:0] polkitd 126191 0.1 6.3 990528 473472 ? Ssl Oct10 113:22 /usr/lib/polkit-1/polkitd --no-debug
說明(與ps -l並不相同):
USER:該 process 屬於那個使用者賬號的
PID :該 process 的號碼
%CPU:該 process 使用掉的 CPU 資源百分比
%MEM:該 process 所占用的物理內存百分比
VSZ :該 process 使用掉的虛擬內存量 (Kbytes)
RSS :該 process 占用的固定的內存量 (Kbytes)
TTY :該 process 是在那個終端機上面運作,若與終端機無關,則顯示 ?,另外, tty1-tty6 是本機上面的登入者程序,若為 pts/0 等等的,則表示為由網絡連接進主機的程序。
STAT:該程序目前的狀態,主要的狀態有
R :該程序目前正在運作,或者是可被運作
S :該程序目前正在睡眠當中 (可說是 idle 狀態),但可被某些訊號 (signal) 喚醒。
T :該程序目前正在偵測或者是停止了
Z :該程序應該已經終止,但是其父程序卻無法正常的終止他,造成 zombie (疆屍) 程序的狀態
START:該 process 被觸發啟動的時間
TIME :該 process 實際使用 CPU 運作的時間
COMMAND:該程序的實際指令
7、列出類似程序樹的程序顯示
命令:ps -axjf
[root@CTU1000094955 ~]# ps -axjf PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 2 0 0 ? -1 S 0 0:12 [kthreadd] 2 3 0 0 ? -1 S 0 0:00 \_ [ksoftirqd/0] 2 5 0 0 ? -1 S< 0 0:00 \_ [kworker/0:0H] 2 7 0 0 ? -1 S 0 0:27 \_ [migration/0] ... ...中間省略了部分內容 1 126191 126191 126191 ? -1 Ssl 997 113:23 /usr/lib/polkit-1/polkitd --no-debug 126191 20349 126191 126191 ? -1 Z 997 0:00 \_ [pkla-check-auth] <defunct>1 85204 85204 85204 ? -1 Ssl 0 10:33 /usr/libexec/accounts-daemon 1 103598 103580 85217 ? -1 S 0 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/CTU1000094955.pid 103598 103762 103580 85217 ? -1 Sl 27 20:06 \_ /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/l 1 25566 25566 25566 ? -1 Ss 0 0:00 /usr/sbin/sshd -D 25566 59785 59785 59785 ? -1 Ss 0 0:00 \_ sshd: root@pts/0 59785 59795 59795 59795 pts/0 71869 Ss 0 0:00 \_ -bash 59795 71869 71869 59795 pts/0 71869 R+ 0 0:00 \_ ps -axjf 1 68591 68583 16869 ? -1 Sl 0 24:19 /biz/maas/cmdp/jre/bin/java -Djava.util.logging.config.file=/biz/maas/cmdp/tomcat/conf/logging.properties -Djava.util.logging.man 1 71817 829 829 ? -1 Sl 991 0:01 /usr/bin/python -Es /usr/sbin/setroubleshootd -f
8、找出與 cron 與 syslog 這兩個服務有關的 PID 號碼
命令:ps aux | egrep '(cron|syslog)'
[root@CTU1000094955 ~]# ps aux | egrep '(cron|syslog)' root 856 0.0 0.2 506844 16808 ? Ssl Oct04 57:17 /usr/sbin/rsyslogd -n root 1768 0.0 0.0 130480 1528 ? Ss Oct04 1:20 /usr/sbin/crond -n gnome-i+ 5961 0.0 0.0 477312 3576 ? S<l Oct04 0:13 /usr/bin/pulseaudio --start --log-target=syslog root 72278 0.0 0.0 118872 1040 pts/0 S+ 11:45 0:00 grep -E --color=auto (cron|syslog)
9、可以用 | 管道和 more 連接起來分頁查看
命令:ps -aux |more
[root@CTU1000094955 ~]# ps -aux |more USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 201588 13760 ? Ss Oct04 20:53 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0.0 0.0 0 0 ? S Oct04 0:12 [kthreadd] ... ... 中間省略了部分 root 35 0.0 0.0 0 0 ? S Oct04 0:00 [rcuob/26] root 36 0.0 0.0 0 0 ? S Oct04 0:00 [rcuob/27] root 37 0.0 0.0 0 0 ? S Oct04 0:00 [rcuob/28] --More--
10、把所有進程顯示出來,並輸出到ps001.txt文件
命令:ps -aux > 目的文件
[root@CTU1000094955 ~]# ps -aux > pstest.txt [root@CTU1000094955 ~]# ll total 76 -rw-------. 1 root root 1664 Jan 16 2017 anaconda-ks.cfg drwxr-xr-x. 2 root root 4096 Jan 16 2017 Desktop drwxr-xr-x. 2 root root 4096 Jan 16 2017 Documents drwxr-xr-x. 5 root root 4096 Nov 1 18:16 Downloads -rw-------. 1 root root 1712 Jan 16 2017 initial-setup-ks.cfg drwxr-xr-x. 2 root root 4096 Jan 16 2017 Music drwxr-xr-x. 2 root root 4096 Jan 16 2017 Pictures -rw-r--r--. 1 root root 36460 Nov 23 11:50 pstest.txt
11、輸出指定的字段
命令:ps -o pid,ppid,pgrp,session,tpgid,comm
[root@CTU1000094955 ~]# ps -o pid,ppid,pgrp,session,tpgid,comm PID PPID PGRP SESS TPGID COMMAND 59795 59785 59795 59795 73308 bash 73308 59795 73308 59795 73308 ps