ps命令的10個例子

譯者: geekpi發表於2022-11-27

Linux ps 命令

linux的ps命令是一個檢視系統執行的程式的一個最基礎的工具。它提供了一個當前程式的快照,還帶有一些具體的資訊,比如使用者id,cpu使用率,記憶體使用,命令名等,它不會像top或者htop一樣實時顯示資料。雖然它在功能和輸出上更加簡單,但它仍然是每個linux新手需要了解和學好的必要程式管理/檢測工具。

在本篇中,我們會學習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中國 榮譽推出

相關文章