進程查看器 - ps 命令

ps 命令是 process status 的簡寫,主要用於查詢當前正在運行中進程的信息,它從 /proc/進程ID 目錄中讀取指定進程ID的信息mysql

語法

ps [options]

ps 的選項很是多,總共有一百多個選項,能夠經過 ps L | wc -l 命令查看ps的選項數量sql

這篇文章主要介紹 ps 命令的一些經常使用的用法,對於一些使用頻率很低的選項不在這裏討論centos

選項風格

根據選項前是否有 -,ps命令的選項能夠分紅如下幾種風格bash

  • UNIX風格: 選項前面必須以 - 開頭
  • BSD分格: 選項前面必須不能以 - 開頭
  • GNU風格: 選項前面必須以 -- 開頭
[root@ecs-centos-7 ~]# ps p 842
  PID TTY      STAT   TIME COMMAND
  842 ?        Sl    12:55 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
[root@ecs-centos-7 ~]# ps -p 842
  PID TTY          TIME CMD
  842 ?        00:12:55 mysqld
[root@ecs-centos-7 ~]# ps --pid 842
  PID TTY          TIME CMD
  842 ?        00:12:55 mysqld

上面的例子中 ps p 842 ps -p 842 以及 ps --pid 842 都是查詢進程ID爲842的進程信息,只不過度別用ps命令選項的 BSD風格、UNIX風格、GNU風格而已服務器

注意:ps命令選項能夠混用不一樣風格的選項,可是可能會出現衝突,兼容混用的主要緣由是幫助過分舊的腳本和習慣,咱們實際使用的時候儘可能使用同一種風格的選項ui

全部運行中的進程

經過 ps -A 或者 ps -e 命令能夠查看全部運行中的進程線程

[tt@ecs-centos-7 ~]$ ps -fA | more
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Aug14 ?        00:00:07 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2     0  0 Aug14 ?        00:00:00 [kthreadd]
root         4     2  0 Aug14 ?        00:00:00 [kworker/0:0H]

[tt@ecs-centos-7 ~]$ ps -fe | more
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Aug14 ?        00:00:07 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2     0  0 Aug14 ?        00:00:00 [kthreadd]
root         4     2  0 Aug14 ?        00:00:00 [kworker/0:0H]

列說明:code

UID: 進程所屬的用戶
PID: 進程ID
PPID: 進程的父進程ID
C: 同 %CPU,進程CPU利用率
STIME: 進程啓動的日期
TTY: 進程相關的終端
TIME: 進程佔用的總CPU時間
CMD: 進程啓動命令以及參數

-f-F選項:全格式列表選項,這個選項和其餘UNIX風格的選項組合使用能夠使得結果多出一些列blog

上面例子中 -A-e 選項都是查看全部運行的進程信息的,後面重定向到 more 命令是爲了分頁查看結果進程

查看指定用戶的進程

-u、-U、U、--user、--User 這幾個選項後面接用戶名列表(用戶名之間用逗號分隔) 或用戶ID列表(ID之間用逗號分隔) , 能夠查看指定用戶列表中用戶的進程

  • 用戶名列表
[root@ecs-centos-7 ~]# ps -u tt
  PID TTY          TIME CMD
13087 pts/8    00:00:00 bash
13257 pts/9    00:00:00 bash
[root@ecs-centos-7 ~]# ps -u wl
  PID TTY          TIME CMD
13275 pts/11   00:00:00 bash
13294 pts/11   00:00:00 top

[root@ecs-centos-7 ~]# ps -u tt,wl
  PID TTY          TIME CMD
13087 pts/8    00:00:00 bash
13257 pts/9    00:00:00 bash
13275 pts/11   00:00:00 bash
13294 pts/11   00:00:00 top

上面例子中分別查看了用戶 ttwl 的進程,用戶列表tt,wl的進程其實是列表中每一個用戶的進程組合

  • 用戶ID列表
[root@ecs-centos-7 ~]# id tt
uid=1003(tt) gid=1003(tt) groups=1003(tt)
[root@ecs-centos-7 ~]# id wl
uid=1000(wl) gid=1000(wl) groups=1000(wl)

[root@ecs-centos-7 ~]# ps -u 1003
  PID TTY          TIME CMD
13087 pts/8    00:00:00 bash
13257 pts/9    00:00:00 bash
[root@ecs-centos-7 ~]# ps -u 1000
  PID TTY          TIME CMD
13275 pts/11   00:00:00 bash
13294 pts/11   00:00:00 top

[root@ecs-centos-7 ~]# ps -u 1003,1000
  PID TTY          TIME CMD
13087 pts/8    00:00:00 bash
13257 pts/9    00:00:00 bash
13275 pts/11   00:00:00 bash
13294 pts/11   00:00:00 top

上面例子中分別按照用戶ttwl的用戶ID 查看進程, 用戶ID列表1003,1000的進程其實是列表中每一個用戶ID的進程組合

查看指定進程ID的進程

ps p 進程IDps -p 進程IDps --pid 進程ID 這三種方式均可以查看指定進程ID的進程信息

[root@ecs-centos-7 ~]# ps -p 1,2,4
  PID TTY          TIME CMD
    1 ?        00:00:07 systemd
    2 ?        00:00:00 kthreadd
    4 ?        00:00:00 kworker/0:0H

上面例子中查看進程ID分別爲 1,2,4 的進程信息,使用 ps p 1,2,4 命令或者 ps --pid 1,2,4 命令也能夠獲得和例子中同樣的結果

查看線程

知道了進程ID,能夠經過 ps -fL -p 進程ID 命令查看指定進程的線程信息

[root@ecs-centos-7 ~]# ps -fL -p 842
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
mysql      842     1   842  0   27 Aug14 ?        00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
mysql      842     1  1043  0   27 Aug14 ?        00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
mysql      842     1  1061  0   27 Aug14 ?        00:00:37 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

線程相關字段說明:

LWP: 線程ID
NLWP: 線程數量

上面的例子查看進程ID爲842的進程(MySQL進程)的線程信息,因爲輸出信息太多,這裏只截取了一部分,從結果能夠看出,MySQL進程有27個線程,其中 PIDLWP 值相同的是主線程

根據進程名字得到進程ID

在服務器開發中,關閉服務器進程的時候,一般都須要根據進程名字取得進程ID,而後再利用 kill 命令向指定進程ID發送終止信號

[root@ecs-centos-7 ~]# ps aux | grep mysql | grep -v grep | awk '{print $2}'
842

上面的例子中,ps aux 是查找全部用戶運行的進程,grep mysql 是從前面查找的結果中過濾出含有mysql的關鍵字,grep -v grep 是從上一步的結果中進一步去掉含有 grep 的關鍵字,最後 awk '{print $2} 是輸出最終結果中第二列的值,也即MySQL的進程ID

注意:ps命令查找的結果中程序啓動命令以及參數(CMD列)最多隻能顯示15個字符寬度,若是應用程序名字查過15字符長度,就會被截斷,此時用 grep 查找應用程序名字的話會出現找不到應用程序的狀況。關於這個問題請參考 ps 命令顯示不完整的問題

總結

在對 Linux 系統中問題進行故障排除的過程當中,ps命令是經常使用的命令之一,它有不少的選項,可是大多數時候都在使用 ps aux 或者 ps -ef 命令查看正在運行進程的信息

有關 ps 命令更多選項能夠經過 man ps命令查看

推薦閱讀

Linux 下top命令詳解

ps 命令顯示不完整的問題

相關文章
相關標籤/搜索