linux每日命令(34):ps命令和pstree命令
Linux中的ps命令是Process Status的縮寫。ps命令用來列出系統中當前執行的那些程序。ps命令列出的是當前那些程序的快照,就是執行ps命令的那個時刻的那些程序,如果想要動態的顯示程序資訊,就可以使用top命令。
要對程序進行監測和控制,首先必須要了解當前程序的情況,也就是需要檢視當前程序,而 ps 命令就是最基本同時也是非常強大的程序檢視命令。使用該命令可以確定有哪些程序正在執行和執行的狀態、程序是否結束、程序有沒有僵死、哪些程序佔用了過多的資源等等。總之大部分資訊都是可以通過執行該命令得到的。
ps 為我們提供了程序的一次性的檢視,它所提供的檢視結果並不動態連續的;如果想對程序時間監控,應該用 top 工具。
kill 命令用於殺死程序。
linux上程序有5種狀態
-
執行(正在執行或在執行佇列中等待)
-
中斷(休眠中, 受阻, 在等待某個條件的形成或接受到訊號)
-
不可中斷(收到訊號不喚醒和不可執行, 程序必須等待直到有中斷髮生)
-
僵死(程序已終止, 但程序描述符存在, 直到父程序呼叫wait4()系統呼叫後釋放)
-
停止(程序收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU訊號後停止執行執行)
一.命令格式:
ps [引數]
二.命令功能:
用於顯示當前程序 (process) 的狀態。
三.命令引數:
ps 的引數非常多, 在此僅列出幾個常用的引數並大略介紹含義
引數 | 描述 |
---|---|
-A | 列出所有的行程 |
-e | 等於“-A” |
-a | 顯示現行終端機下的所有程序,包括其他使用者的程序; |
-u | 以使用者為主的程序狀態 ; |
x | 通常與 a 這個引數一起使用,可列出較完整資訊。 |
-w | 顯示加寬可以顯示較多的資訊 |
-au | 顯示較詳細的資訊 |
-aux | 顯示所有包含其他使用者的行程 |
-f | 做一個更為完整的輸出。 |
四. 使用例項
1. 顯示所有程序資訊
命令:
ps -A
輸出:
[root@localhost autoAweme]# ps -A PID TTYTIME CMD 1 ?00:00:15 systemd 2 ?00:00:00 kthreadd 3 ?00:00:56 ksoftirqd/0 5 ?00:00:00 kworker/0:0H 7 ?00:01:01 migration/0 8 ?00:00:00 rcu_bh 9 ?00:18:57 rcu_sched 10 ?00:00:00 lru-add-drain 11 ?00:00:03 watchdog/0 12 ?00:00:02 watchdog/1 13 ?00:01:01 migration/1 14 ?00:00:56 ksoftirqd/1 16 ?00:00:00 kworker/1:0H ……省略部分結果
2. 顯示指定使用者資訊
命令:
ps -u root
輸出:
[root@localhost autoAweme]# ps -u root PID TTYTIME CMD 1 ?00:00:15 systemd 2 ?00:00:00 kthreadd 3 ?00:00:56 ksoftirqd/0 5 ?00:00:00 kworker/0:0H 7 ?00:01:01 migration/0 8 ?00:00:00 rcu_bh 9 ?00:18:57 rcu_sched 10 ?00:00:00 lru-add-drain 11 ?00:00:03 watchdog/0 12 ?00:00:02 watchdog/1 13 ?00:01:01 migration/1 14 ?00:00:56 ksoftirqd/1 16 ?00:00:00 kworker/1:0H 18 ?00:00:00 kdevtmpfs 19 ?00:00:00 netns 20 ?00:00:00 khungtaskd ……省略部分結果
說明:
顯示root程序使用者資訊
3. 顯示所有程序資訊,連帶命令列
命令:
ps -ef
輸出:
[root@localhost autoAweme]# ps -ef UIDPIDPPIDC STIME TTYTIME CMD root100 11月30 ?00:00:15 /usr/lib/systemd/systemd --swi root200 11月30 ?00:00:00 [kthreadd] root320 11月30 ?00:00:56 [ksoftirqd/0] root520 11月30 ?00:00:00 [kworker/0:0H] root720 11月30 ?00:01:01 [migration/0] ……省略部分結果
4. ps 與grep 常用組合用法,查詢特定程序
命令:
ps -ef|grep uwsgi
輸出:
[root@localhost autoAweme]# ps -ef|grep uwsgi root305687950 12月01 ?00:00:19 /home/hc/project/envs/pgc/bin/uwsgi --ini /home/hc/project/pgc.ini root30578305680 12月01 ?00:00:00 /home/hc/project/envs/pgc/bin/uwsgi --ini /home/hc/project/pgc.ini root660697951 12:07 ?00:04:29 /home/hc/project/envs/autoAweme/bin/uwsgi --ini /home/hc/project/autoAweme.ini root66096660690 12:07 ?00:00:01 /home/hc/project/envs/autoAweme/bin/uwsgi --ini /home/hc/project/autoAweme.ini root80022860530 16:06 pts/100:00:00 grep --color=auto uwsgi
5:將目前屬於您自己這次登入的 PID 與相關資訊列示出來
命令:
ps -l
輸出:
[root@localhost autoAweme]# ps -l F SUIDPIDPPIDC PRINI ADDR SZ WCHANTTYTIME CMD 4 S085984803190800 - 58596 do_wai pts/100:00:00 su 4 S086053859840800 - 29208 do_wai pts/100:00:01 bash 0 R0 107795860530800 - 38300 -pts/100:00:00 ps
說明:
各相關資訊的意義:
標誌 | 意義 |
---|---|
F | 代表這個程式的旗標 (flag), 4 代表使用者為 super user |
S | 代表這個程式的狀態 (STAT),關於各 STAT 的意義將在內文介紹 |
UID | 程式被該 UID 所擁有 |
PID | 就是這個程式的 ID ! |
PPID | 則是其上級父程式的ID |
C | CPU 使用的資源百分比 |
PRI | 指程序的執行優先權(Priority的簡寫),其值越小越早被執行; |
NI | 這個程序的nice值,其表示程序可被執行的優先順序的修正數值。 |
ADDR | 這個是核心函式,指出該程式在記憶體的那個部分。如果是個 running的程式,一般就是 "-" |
SZ | 使用掉的記憶體大小 |
WCHAN | 目前這個程式是否正在運作當中,若為 - 表示正在運作 |
TTY | 登入者的終端機位置 |
TIME | 使用掉的 CPU 時間。 |
CMD | 所下達的指令為何 |
在預設的情況下, ps 僅會列出與目前所在的 bash shell 有關的 PID 而已,所以, 當我使用 ps -l 的時候,只有三個 PID。
6.列出目前所有的正在記憶體當中的程式
命令:
ps aux
輸出:
[root@localhost autoAweme]# ps aux USERPID %CPU %MEMVSZRSS TTYSTAT STARTTIME COMMAND root10.00.1 1258044260 ?Ss11月300:15 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root20.00.000 ?S11月300:00 [kthreadd] root30.00.000 ?S11月300:56 [ksoftirqd/0] root50.00.000 ?S<11月300:00 [kworker/0:0H] root70.00.000 ?S11月301:01 [migration/0] root80.00.000 ?S11月300:00 [rcu_bh] root90.30.000 ?S11月3019:02 [rcu_sched] ……省略部分結果
說明:
標誌 | 意義 |
---|---|
USER | 該 process 屬於那個使用者賬號的 |
PID | 該 process 的號碼 |
%CPU | 該 process 使用掉的 CPU 資源百分比 |
%MEM | 該 process 所佔用的實體記憶體百分比 |
VSZ | 該 process 使用掉的虛擬記憶體量 (Kbytes) |
RSS | 該 process 佔用的固定的記憶體量 (Kbytes) |
TTY | 該 process 是在那個終端機上面運作,若與終端機無關,則顯示 ?,另外, tty1-tty6 是本機上面的登入者程式,若為 pts/0 等等的,則表示為由網路連線進主機的程式。 |
STAT | 該程式目前的狀態 |
START | 該 process 被觸發啟動的時間 |
TIME | 該 process 實際使用 CPU 運作的時間 |
COMMAND | 該程式的實際指令 |
STAT:該程式目前的狀態,主要的狀態有
ps工具標識程序的5種狀態碼
- D :不可中斷 uninterruptible sleep (usually IO)
- R :該程式目前正在運作,或者是可被運作
- S :該程式目前正在睡眠當中 (可說是 idle 狀態),但可被某些訊號 (signal) 喚醒。
- T :該程式目前正在偵測或者是停止了
- Z :該程式應該已經終止,但是其父程式卻無法正常的終止他,造成 zombie (疆屍) 程式的狀態
7.以類似程序樹的結構顯示
命令:
ps -axjf
輸出:
[root@localhost autoAweme]# ps -axjf PPIDPIDPGIDSID TTYTPGID STATUIDTIME COMMAND 0200 ?-1 S00:00 [kthreadd] 2300 ?-1 S00:57\_ [ksoftirqd/0] 2500 ?-1 S<00:00\_ [kworker/0:0H] 2700 ?-1 S01:02\_ [migration/0] ……省略部分結果 18031024162416 ?-1 Sl10000:25 /usr/libexec/gnome-terminal-server 803108031824162416 ?-1 S10000:00\_ gnome-pty-helper 80310803198031980319 pts/128727 Ss10000:00\_ bash 80319859848598480319 pts/128727 S00:00\_ su 85984860538605380319 pts/128727 S00:01\_ bash 86053287272872780319 pts/128727 R+00:00\_ ps -axjf
8. pstree命令更優雅的樹狀顯示
pstree命令以樹狀圖顯示程序間的關係(display a tree of processes)。ps命令可以顯示當前正在執行的那些程序的資訊,但是對於它們之間的關係卻顯示得不夠清晰。在Linux系統中,系統呼叫fork可以建立子程序,通過子shell也可以建立子程序,Linux系統中程序之間的關係天生就是一棵樹,樹的根就是程序PID為1的init程序。
以樹狀圖只顯示程序的名字,且相同程序合併顯示:
命令:
pstree
輸出:
[root@localhost autoAweme]# pstree systemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager───2*[{NetworkManager}] ├─VGAuthService ├─2*[abrt-watch-log] ├─abrtd ├─accounts-daemon───2*[{accounts-daemon}] ├─alsactl ├─at-spi-bus-laun─┬─dbus-daemon │└─3*[{at-spi-bus-laun}] ├─at-spi2-registr───2*[{at-spi2-registr}] ├─atd ├─auditd─┬─audispd─┬─sedispatch ││└─{audispd} │└─{auditd} ├─avahi-daemon───avahi-daemon ……省略部分結果
以樹狀圖顯示程序同時還顯示PID:
命令:
pstree -p
輸出:
[root@localhost autoAweme]# pstree -p systemd(1)─┬─ModemManager(686)─┬─{ModemManager}(722) │└─{ModemManager}(744) ├─NetworkManager(796)─┬─{NetworkManager}(807) │└─{NetworkManager}(811) ├─VGAuthService(677) ├─abrt-watch-log(698) ├─abrt-watch-log(703) ├─abrtd(684) ├─accounts-daemon(680)─┬─{accounts-daemon}(699) │└─{accounts-daemon}(742) ├─alsactl(679) ├─at-spi-bus-laun(2636)─┬─dbus-daemon(2641) │├─{at-spi-bus-laun}(2637) │├─{at-spi-bus-laun}(2638) │└─{at-spi-bus-laun}(2640) ├─at-spi2-registr(2643)─┬─{at-spi2-registr}(2648) │└─{at-spi2-registr}(2649) ├─atd(1171) ……省略部分結果
以樹狀圖顯示程序PID為的程序以及子孫程序,如果有-p引數則同時顯示每個程序的PID:
命令:
pstree [-p] <pid>
輸出:
[root@localhost autoAweme]# pstree 1244 mysqld_safe───mysqld───19*[{mysqld}] [root@localhost autoAweme]# pstree -p 1244 mysqld_safe(1244)───mysqld(1869)─┬─{mysqld}(1906) ├─{mysqld}(1911) ├─{mysqld}(1912) ├─{mysqld}(1913) ├─{mysqld}(1914) ├─{mysqld}(1915) ├─{mysqld}(1916) ├─{mysqld}(1917) ├─{mysqld}(1918) ├─{mysqld}(1919) ├─{mysqld}(1920) ├─{mysqld}(1926) ├─{mysqld}(1927) ├─{mysqld}(1928) ├─{mysqld}(1929) ├─{mysqld}(1930) ├─{mysqld}(1931) ├─{mysqld}(2081) └─{mysqld}(77714)
以樹狀圖顯示程序,相同名稱的程序不合並顯示,並且會顯示命令列引數,如果有-p引數則同時顯示每個程序的PID。
命令:
pstree -a
輸出:
[root@localhost autoAweme]# pstree -a systemd --switched-root --system --deserialize 22 ├─ModemManager │└─2*[{ModemManager}] ├─NetworkManager --no-daemon │└─2*[{NetworkManager}] ├─VGAuthService -s ├─supervisord /usr/bin/supervisord -c /etc/supervisord.conf │├─celery /home/hc/project//envs/autoAweme/bin/celery worker -A celery_worker.celery -l info ││├─celery /home/hc/project//envs/autoAweme/bin/celery worker -A celery_worker.celery -l info │││└─{celery} ││├─celery /home/hc/project//envs/autoAweme/bin/celery worker -A celery_worker.celery -l info │││└─{celery} ││└─2*[{celery}] │├─uwsgi --ini /home/hc/project/pgc.ini ││└─uwsgi --ini /home/hc/project/pgc.ini │└─uwsgi --ini /home/hc/project/autoAweme.ini │├─uwsgi --ini /home/hc/project/autoAweme.ini │└─2*[{uwsgi}] ……省略部分結果
注:因為pstree輸出的資訊可能比較多,所以最好與more/less配合使用,使用上下箭頭檢視,按q退出。
pstree -p | less
9. 其他例項
- 可以用 | 管道和 more 連線起來分頁檢視
命令:
ps -aux |more
- 把所有程序顯示出來,並輸出到ps001.txt檔案
命令:
ps -aux > ps001.txt
- 輸出指定的欄位
命令:
ps -o pid,ppid,pgrp,session,tpgid,comm