這才是使用ps命令的正確姿勢

2022-10-24 18:00:29

這才是使用ps命令的正確姿勢

前言

在linux系統當中我們通常會使用命令去檢視一些系統的程序資訊,我們最常使用的就是 ps (process status)。ps 命令主要是用於檢視當前正在執行的程式,以及他們相關的的資訊,我們可以通過不同的選項進行檢視。ps 給我們提供了非常多的選項,這些選項常常令人分辨不清楚,本篇文章我們仔細談一談 ps 輸出具體的含義。

ps命令詳解

只輸出跟當前shell有關的程序

當我們在命令列當中直接輸入 ps 命令,那麼就只能夠看到在當前終端當中啟動的程序,即使同一個使用者啟動其他的終端,在這個終端當中也不能看到同一個使用者在其他終端啟動的程序,如下圖所示:

分割線表示上下有兩個終端:

  • 我們在上一個終端後臺啟動一個 sleep.out 的程式,我們就能夠在上面的終端裡面看到我們剛剛啟動的程式。
  • 但是我們在下面同一個使用者的不同終端就不能夠看到在上面一個終端啟動的程式。

ps 命令輸出的含義:

  • PID:程序的程序號,有唯一性。
  • TTY:使用者登陸的時候使用的虛擬終端。
  • TIME:程式使用的CPU時間總和。
  • CMD:程序啟動的時候執行的命令。

輸出所有的程序

ps -A
ps -e

上面的兩個命令輸出系統當中所有的程序資訊,我們可以使用這個命令統計系統當中一個有多少程序:

輸出所有程序但是排除終端和session leader

ps -a

上面的命令輸出除了 session leader 和跟終端無關的所有程序。

  • 跟終端無關的程序很好理解,就是跟終端脫離關係,一般是系統程序和使用者的守護行程。
  • 而 session leader 就是你登陸終端時候的那個程序,如下圖所示:

一個更具體的描述一個 shell 中 session leader 和其他程序的關係如下圖所示(圖中最左方就是 session leader 程序):

檢視正在執行的程式

ps -r

檢視當前使用者的程序

ps -x

檢視具體某個程序的資訊

ps -p pid

輸出內容攜帶使用者名稱

ps -u

檢視所有與當前終端有關的程序

這個命令和直接輸入ps執行的效果一樣

ps -T

一個我們非常熟悉的命令

我們在linux作業系統下面我們通常使用 ps 命令的時候,我們會使用如下兩個命令:

ps aux # ax 通常要在一起使用 一起使用時候的效果和 -e 或者 -A 是一樣的
ps -ef

其實在很多情況下我們只想檢視與我們自己有關的程式,而上面的兩個命令還檢視了很多其他使用者的程序,因此我們可以修改一下上面兩個命令:

ps xu

上面這個命令只會輸出與我們自己有關的程式同時輸出的內容還算完整。

指定ps命令輸出的內容

在前面的命令當中我們都沒有客製化化的輸出過一些內容,都是ps命令想輸出啥就輸出啥!其實我們可以指定ps命令只輸出我們需要的內容,比如下面的命令輸出程序id,父程序id,以及程式執行時候輸入的命令:

ps -o pid,ppid,command
➜  pthreads ps -o pid,ppid,command
    PID    PPID COMMAND
2782266   34624 /usr/bin/zsh
2825942 2782266 ps -o pid,ppid,command

-o表示指定我們想要輸出的內容,在上面的命令當中:

  • pid: 表示當前程序的程序號。
  • ppid: 表示當前程序父程序的程序號。
  • command: 表示執行這個命令的時候輸入的命令。

還有很多其他的可以輸出的內容,在下表當中列出一些經常使用的條目:

條目 含義
pid 程序號
ppid 父程序程序號
command 執行命令
%cpu 程序對於cpu的使用率
%mem 記憶體佔有率
comm 更加簡潔的命令和command一致
cputime 程序累計使用的CPU時間
etime 程序開始執行到現在一共過了多長時間
stat 程序的狀態
ni 程序的優先順序
user 使用者名稱

這裡我們在重點談一下程序的狀態 stat,我們看一個他的輸出:

➜  pthreads ps -o pid,ppid,stat,command
    PID    PPID STAT COMMAND
2782266   34624 Ss   /usr/bin/zsh
2832729 2782266 SN   ./sleep.out
2832740 2782266 R+   ps -o pid,ppid,stat,command

在上面當中 STAT 那一列就是表示程序的狀態,我們現在仔細分析一下上面字母表示的含義:

STAT 當中字母的含義表:

條目 含義
D 表示不能夠被中斷的睡眠操作,比如說IO操作
I 核心當中的空閒執行緒
R 正在執行或者處於就緒佇列當中的程序
S 可以被中斷的睡眠,一般是等待某個事件觸發
T 被其他的程序傳送的訊號給停下來了
t 被偵錯或者tracing中
Z 表示這個程序是一個殭屍程序
< 表示高優先順序
N 表示低優先順序
L 有頁面被所在記憶體當中,也就是說這個頁面不會被作業系統換出道對換區當中
s 表示這個程序是一個 session leader
l 是一個多執行緒程式
+ 表示在前臺行程群組當中

現在根據上面表格當中的內容我們可以知道:

  • 程序 2782266 正在等待某個事件觸發,而且這個程序是 session leader。
  • 程序 2832729 也是在等待某個事件觸發,而且是低優先順序的程序。
  • 程序 2832740 正在執行。

下圖表示 linux 當中程序的幾種狀態:

我們在來看一個多程序程式的例子:


#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

void* func(void* args) {
  while (1)
  {
    /* code */
  }
  
}
int main() {
  for(int i = 0; i < 10; i++) {
    pthread_t tid;
    pthread_create(&tid, NULL, func, NULL);
  }
  while (1)
  {
    sleep(1);
  }
  
  return 0;
}

上面的程式執行完成之後,ps 的輸出結果如下:

➜  pthreads ps -o pid,ppid,stat,command
    PID    PPID STAT COMMAND
2782266   34624 Ss   /usr/bin/zsh
2840012 2782266 SNl  ./sleep.out # 這個程序就是上面那個程式表示的程序
2840037 2782266 R+   ps -o pid,ppid,stat,command

我們可以看到這個程序的 STAT 當中還有一個 l 表示這是一個多程序的程式。

總結

在本篇文章當中主要給大家介紹了一些常見的 ps 命令的使用方法,以及一些常用的輸出,還有就是輸出內容中比較重要的程序狀態,能夠很好的幫助我們實時去了解程序。


以上就是本篇文章的所有內容了,我是LeHung,我們下期再見!!!更多精彩內容合集可存取專案:https://github.com/Chang-LeHung/CSCore

關注公眾號:一無是處的研究僧,瞭解更多計算機(Java、Python、計算機系統基礎、演演算法與資料結構)知識。