在linux系統當中我們通常會使用命令去檢視一些系統的程序資訊,我們最常使用的就是 ps (process status)。ps 命令主要是用於檢視當前正在執行的程式,以及他們相關的的資訊,我們可以通過不同的選項進行檢視。ps 給我們提供了非常多的選項,這些選項常常令人分辨不清楚,本篇文章我們仔細談一談 ps 輸出具體的含義。
當我們在命令列當中直接輸入 ps 命令,那麼就只能夠看到在當前終端當中啟動的程序,即使同一個使用者啟動其他的終端,在這個終端當中也不能看到同一個使用者在其他終端啟動的程序,如下圖所示:
分割線表示上下有兩個終端:
ps 命令輸出的含義:
ps -A
ps -e
上面的兩個命令輸出系統當中所有的程序資訊,我們可以使用這個命令統計系統當中一個有多少程序:
ps -a
上面的命令輸出除了 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命令只輸出我們需要的內容,比如下面的命令輸出程序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 | 執行命令 |
%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 | 是一個多執行緒程式 |
+ | 表示在前臺行程群組當中 |
現在根據上面表格當中的內容我們可以知道:
下圖表示 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、計算機系統基礎、演演算法與資料結構)知識。