ps命令的10個例子
在本篇中,我們會學習ps命令基本的用法:查找、過濾,以不同的方式排序。
語法說明
ps命令有兩種不同風格的語法規則:BSD風格和UNIX風格。Linux新手經常感到困惑並會誤解這兩種風格,所以在繼續下一步之前,我們來弄清楚一些基本的信息。
注意: "ps aux"不等同於"ps -aux"。比如"-u"用於顯示用戶的進程,但是"u"意味著顯示具體信息。
BSD 形式 - BSD形式的語法的選項前沒有破折號,如:
ps aux
UNIX/LINUX 形式 - linux形式的語法的選項前有破折號,如:
ps -ef
在linux系統上混合這兩種語法是可以的。比如 "ps ax -f"。但是本章中我們主要討論UNIX形式語法。
如何使用ps命令
1. 顯示所有進程
下面的命令可以顯示所有進程的列表。
$ ps ax
$ ps -ef
通過管道輸出到"less"可以分頁。
使用"u"或者"-f"選項可以顯示進程的具體信息。
$ ps aux
$ ps -ef -f
為什麼USER列顯示的不是我的用戶名,但是其他的像root,www-data等卻顯示? 對於所有的用戶(包括你們的),如果長度大於8個字元,那麼ps只會顯示你的UID而不是用戶名。
2. 顯示用戶進程
使用"-u"選項後跟用戶名來過濾所屬用戶的進程。多個用戶名可以用逗號分隔。
$ ps -f -u www-data
UID PID PPID C STIME TTY TIME CMD
www-data 1329 1328 0 09:32 ? 00:00:00 nginx: worker process
www-data 1330 1328 0 09:32 ? 00:00:00 nginx: worker process
www-data 1332 1328 0 09:32 ? 00:00:00 nginx: worker process
www-data 1377 1372 0 09:32 ? 00:00:00 php-fpm: pool a.localhost
www-data 1378 1372 0 09:32 ? 00:00:00 php-fpm: pool a.localhost
www-data 4524 2359 0 10:03 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 4527 2359 0 10:03 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 4528 2359 0 10:03 ? 00:00:00 /usr/sbin/apache2 -k start
3. 通過名字或者進程id顯示進程
通過"-C"選項後面加上名字或者命令來搜索進程。
$ ps -C apache2
PID TTY TIME CMD
2359 ? 00:00:00 apache2
4524 ? 00:00:00 apache2
4525 ? 00:00:00 apache2
...
要通過進程id顯示進程,就使用"-p"選項,並且還可以通過逗號分隔來指定多個進程id。
$ ps -f -p 3150,7298,6544
"-C"必須提供精確的進程名,並且它並不能通過部分名字或者通配符查找。為了更靈活地搜索進程列表,通常使用grep命令。
$ ps -ef | grep apache
4. 通過cpu或者內存使用排序進程
系統管理員通常想要找出那些消耗最多內存或者CPU的進程。排序選項會基於特定的欄位或者參數來排序進程列表。
可以用'--sort'指定多個欄位,並用逗號分割。除此之外,欄位前面還可以跟上'-'或者'+'的前綴來相應地表示遞減和遞增排序。這裡有很多的用於排序的選項,通過man頁來獲取完整的列表。
$ ps aux --sort=-pcpu,+pmem
顯示前5名最耗cpu的進程。
$ ps aux --sort=-pcpu | head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 2.6 0.7 51396 7644 ? Ss 02:02 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 23
root 1249 2.6 3.0 355800 30896 tty1 Rsl+ 02:02 0:02 /usr/bin/X -background none :0 vt01 -nolisten tcp
root 508 2.4 1.6 248488 16776 ? Ss 02:02 0:03 /usr/bin/python /usr/sbin/firewalld --nofork
silver 1525 2.1 2.3 448568 24392 ? S 02:03 0:01 /usr/bin/python /usr/share/system-config-printer/applet.py
5. 以樹的形式顯示進程層級
許多進程實際上是從同一個父進程fork出來的,了解父子關係通常是很有用的。"--forest" 選項會構造一個ascii藝術形式的進程層級視圖。
下面的命令會用apache2的進程名來搜索並構造一個樹來顯示具體信息。
$ ps -f --forest -C apache2
UID PID PPID C STIME TTY TIME CMD
root 2359 1 0 09:32 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 4524 2359 0 10:03 ? 00:00:00 _ /usr/sbin/apache2 -k start
www-data 4525 2359 0 10:03 ? 00:00:00 _ /usr/sbin/apache2 -k start
www-data 4526 2359 0 10:03 ? 00:00:00 _ /usr/sbin/apache2 -k start
www-data 4527 2359 0 10:03 ? 00:00:00 _ /usr/sbin/apache2 -k start
www-data 4528 2359 0 10:03 ? 00:00:00 _ /usr/sbin/apache2 -k start
不要在排序中使用樹狀顯示,因為兩者都會以不同方式影響顯示的順序。
6. 顯示父進程的子進程
下面一個是找出所有從apache進程fork出來的進程的例子。
$ ps -o pid,uname,comm -C apache2
PID USER COMMAND
2359 root apache2
4524 www-data apache2
4525 www-data apache2
4526 www-data apache2
4527 www-data apache2
4528 www-data apache2
第一個屬於root的進程是apache2的主進程,其他的apache進程都是從主進程fork出來的。下面的命令使用apache2主進程的pid列出了所有的apache2的子進程。
$ ps --ppid 2359
PID TTY TIME CMD
4524 ? 00:00:00 apache2
4525 ? 00:00:00 apache2
4526 ? 00:00:00 apache2
4527 ? 00:00:00 apache2
4528 ? 00:00:00 apache2
7. 顯示進程的線程
"-L"選項會隨著進程一起顯示線程。它可用於顯示所有指定進程或者所有進程的線程。
下面的命令會顯示進程id為3150的進程的所有線程。
$ ps -p 3150 -L
8. 改變顯示的列
ps命令可以被配置用來只顯示被選中的列。很多列可以被用來顯示,完整的列表可以查看man頁。
下面的命令會只顯示pid、用戶名、cpu、內存、命令列。
$ ps -e -o pid,uname,pcpu,pmem,comm
同樣可以重命名列的名字。
$ ps -e -o pid,uname=USERNAME,pcpu=CPU_USAGE,pmem,comm
PID USERNAME CPU_USAGE %MEM COMMAND
1 root 0.0 0.0 init
2 root 0.0 0.0 kthreadd
3 root 0.0 0.0 ksoftirqd/0
4 root 0.0 0.0 kworker/0:0
5 root 0.0 0.0 kworker/0:0H
7 root 0.0 0.0 migration/0
8 root 0.0 0.0 rcu_bh
9 root 0.0 0.0 rcuob/0
10 root 0.0 0.0 rcuob/1
非常靈活。
9. 顯示進程運行的時間
運行的時間指的是,進程已經運行的時間。運行時間的列並沒有默認顯示,需要使用-o選項帶入。
$ ps -e -o pid,comm,etime
10. 將ps轉換為實時進程查看器
通常上,watch命令可將ps命令變成實時進程查看器。像這個簡單的命令
$ watch -n 1 'ps -e -o pid,uname,cmd,pmem,pcpu --sort=-pmem,-pcpu | head -15'
我桌面上的輸出如下。
Every 1.0s: ps -e -o pid,uname,cmd,pmem,pcpu --... Sun Dec 1 18:16:08 2013
PID USER CMD %MEM %CPU
3800 1000 /opt/google/chrome/chrome - 4.6 1.4
7492 1000 /opt/google/chrome/chrome - 2.7 1.4
3150 1000 /opt/google/chrome/chrome 2.7 2.5
3824 1000 /opt/google/chrome/chrome - 2.6 0.6
3936 1000 /opt/google/chrome/chrome - 2.4 1.6
2936 1000 /usr/bin/plasma-desktop 2.3 0.2
9666 1000 /opt/google/chrome/chrome - 2.1 0.8
3842 1000 /opt/google/chrome/chrome - 2.1 0.8
4739 1000 /opt/google/chrome/chrome - 1.8 1.0
3930 1000 /opt/google/chrome/chrome - 1.7 1.0
3911 1000 /opt/google/chrome/chrome - 1.6 0.6
3645 1000 /opt/google/chrome/chrome - 1.5 0.4
3677 1000 /opt/google/chrome/chrome - 1.5 0.4
3639 1000 /opt/google/chrome/chrome - 1.4 0.4
輸出會每秒刷新狀態,但是這其實很top不同。你會發現top/htop命令的輸出相比上面的ps命令刷新得更頻繁。
這是因為top輸出是結合了cup使用值和內存使用值後的排序值。但是上面的ps命令是一個更簡單的行為的排序,每次獲取一列(像學校的數學),因此它不會像top那樣快速更新。
via: http://www.binarytides.com/linux-ps-command/
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive