Linux中國

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/

譯者:geekpi 校對:Caroline

本文由 LCTT 原創翻譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國