Linux中的ps命令是Process Status的縮寫。ps命令用來列出系統中當前運行的那些進程。ps命令列出的是當前那些進程的快照,linux
就是執行ps命令的那個時刻的那些進程,若是想要動態的顯示進程信息,就可使用top命令。shell
要對進程進行監測和控制,首先必需要了解當前進程的狀況,也就是須要查看當前進程,而 ps 命令就是最基本同時也是很是強大的進程查看命令。使用該命令能夠肯定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程佔用了過多的資源等等。總之大部分信息都是能夠經過執行該命令獲得的。ubuntu
命令參數: a 顯示全部進程 -a 顯示同一終端下的全部程序 -A 顯示全部進程 c 顯示進程的真實名稱 -N 反向選擇 -e 等於「-A」 e 顯示環境變量 f 顯示程序間的關係 -H 顯示樹狀結構 r 顯示當前終端的進程 T 顯示當前終端的全部程序 u 指定用戶的全部進程 -au 顯示較詳細的資訊 -aux 顯示全部包含其餘使用者的行程 -C<命令> 列出指定命令的情況 --lines<行數> 每頁顯示的行數 --width<字符數> 每頁顯示的字符數 --help 顯示幫助信息 --version 顯示版本顯示
pstree以樹結構顯示進程
$ pstree -p work | grep adbash
sshd(22669)---bash(22670)---ad_preprocess(4551)-+-{ad_preprocess}(4552) |-{ad_preprocess}(4553) |-{ad_preprocess}(4554) |-{ad_preprocess}(4555) |-{ad_preprocess}(4556) `-{ad_preprocess}(4557)
work爲工做用戶,-p爲顯示進程識別碼,ad_preprocess共啓動了6個子線程,加上主線程共7個線程網絡
$ ps -Lf 4551session
UID PID PPID LWP C NLWP STIME TTY STAT TIME CMD work 4551 22670 4551 2 7 16:30 pts/2 Sl+ 0:02 ./ad_preprocess work 4551 22670 4552 0 7 16:30 pts/2 Sl+ 0:00 ./ad_preprocess work 4551 22670 4553 0 7 16:30 pts/2 Sl+ 0:00 ./ad_preprocess work 4551 22670 4554 0 7 16:30 pts/2 Sl+ 0:00 ./ad_preprocess work 4551 22670 4555 0 7 16:30 pts/2 Sl+ 0:00 ./ad_preprocess work 4551 22670 4556 0 7 16:30 pts/2 Sl+ 0:00 ./ad_preprocess work 4551 22670 4557 0 7 16:30 pts/2 Sl+ 0:00 ./ad_preprocess
進程共啓動了7個線程ssh
linux上進程有5種狀態: 1. 運行(正在運行或在運行隊列中等待) 2. 中斷(休眠中, 受阻, 在等待某個條件的造成或接受到信號) 3. 不可中斷(收到信號不喚醒和不可運行, 進程必須等待直到有中斷髮生) 4. 僵死(進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用後釋放) 5. 中止(進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後中止運行運行) ps工具標識進程的5種狀態碼: D 不可中斷 uninterruptible sleep (usually IO) R 運行 runnable (on run queue) S 中斷 sleeping T 中止 traced or stopped Z 僵死 a defunct (」zombie」) process
pstack顯示每一個進程的棧跟蹤ide
$ pstack 4551 Thread 7 (Thread 1084229984 (LWP 4552)): #0 0x000000302afc63dc in epoll_wait () from /lib64/tls/libc.so.6 #1 0x00000000006f0730 in ub::EPollEx::poll () #2 0x00000000006f172a in ub::NetReactor::callback () #3 0x00000000006fbbbb in ub::UBTask::CALLBACK () #4 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0 #5 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6 #6 0x0000000000000000 in ?? () Thread 6 (Thread 1094719840 (LWP 4553)): #0 0x000000302afc63dc in epoll_wait () from /lib64/tls/libc.so.6 #1 0x00000000006f0730 in ub::EPollEx::poll () #2 0x00000000006f172a in ub::NetReactor::callback () #3 0x00000000006fbbbb in ub::UBTask::CALLBACK () #4 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0 #5 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6 #6 0x0000000000000000 in ?? () Thread 5 (Thread 1105209696 (LWP 4554)): #0 0x000000302b80baa5 in __nanosleep_nocancel () #1 0x000000000079e758 in comcm::ms_sleep () #2 0x00000000006c8581 in ub::UbClientManager::healthyCheck () #3 0x00000000006c8471 in ub::UbClientManager::start_healthy_check () #4 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0 #5 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6 #6 0x0000000000000000 in ?? () Thread 4 (Thread 1115699552 (LWP 4555)): #0 0x000000302b80baa5 in __nanosleep_nocancel () #1 0x0000000000482b0e in armor::armor_check_thread () #2 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0 #3 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6 #4 0x0000000000000000 in ?? () Thread 3 (Thread 1126189408 (LWP 4556)): #0 0x000000302af8f1a5 in __nanosleep_nocancel () from /lib64/tls/libc.so.6 #1 0x000000302af8f010 in sleep () from /lib64/tls/libc.so.6 #2 0x000000000044c972 in Business_config_manager::run () #3 0x0000000000457b83 in Thread::run_thread () #4 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0 #5 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6 #6 0x0000000000000000 in ?? () Thread 2 (Thread 1136679264 (LWP 4557)): #0 0x000000302af8f1a5 in __nanosleep_nocancel () from /lib64/tls/libc.so.6 #1 0x000000302af8f010 in sleep () from /lib64/tls/libc.so.6 #2 0x00000000004524bb in Process_thread::sleep_period () #3 0x0000000000452641 in Process_thread::run () #4 0x0000000000457b83 in Thread::run_thread () #5 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0 #6 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6 #7 0x0000000000000000 in ?? () Thread 1 (Thread 182894129792 (LWP 4551)): #0 0x000000302af8f1a5 in __nanosleep_nocancel () from /lib64/tls/libc.so.6 #1 0x000000302af8f010 in sleep () from /lib64/tls/libc.so.6 #2 0x0000000000420d79 in Ad_preprocess::run () #3 0x0000000000450ad0 in main ()
有十幾種控制進程的方法,下面是一些經常使用的方法: kill -STOP [pid] 發送SIGSTOP (17,19,23)中止一個進程,而並不消滅這個進程。 kill -CONT [pid] 發送SIGCONT (19,18,25)從新開始一箇中止的進程。 kill -KILL [pid] 發送SIGKILL (9)強迫進程當即中止,而且不實施清理操做。 kill -9 -1 終止你擁有的所有進程。 SIGKILL 和 SIGSTOP 信號不能被捕捉、封鎖或者忽略,可是,其它的信號能夠。因此這是你的終極武器。
顯示全部進程信息工具
命令:spa
ps -A
輸出:
PID TTY TIME CMD 1 ? 00:00:08 systemd 2 ? 00:00:00 kthreadd 4 ? 00:00:00 kworker/0:0H 6 ? 00:00:00 mm_percpu_wq 7 ? 00:00:04 ksoftirqd/0 8 ? 00:00:03 rcu_sched 9 ? 00:00:00 rcu_bh 10 ? 00:00:00 migration/0 11 ? 00:00:00 watchdog/0 12 ? 00:00:00 cpuhp/0 13 ? 00:00:00 kdevtmpfs 。。。省略
顯示指定用戶信息
命令:
ps -u root
輸出:
PID TTY TIME CMD 1 ? 00:00:08 systemd 2 ? 00:00:00 kthreadd 4 ? 00:00:00 kworker/0:0H 6 ? 00:00:00 mm_percpu_wq 7 ? 00:00:04 ksoftirqd/0 8 ? 00:00:03 rcu_sched 9 ? 00:00:00 rcu_bh 10 ? 00:00:00 migration/0 11 ? 00:00:00 watchdog/0 12 ? 00:00:00 cpuhp/0 13 ? 00:00:00 kdevtmpfs 14 ? 00:00:00 netns 15 ? 00:00:00 rcu_tasks_kthre
顯示全部進程信息,連同命令行
命令:
ps -ef
輸出:
UID PID PPID C STIME TTY TIME CMD root 1 0 0 May23 ? 00:00:08 /lib/systemd/systemd --system --deserialize 21 root 2 0 0 May23 ? 00:00:00 [kthreadd] root 4 2 0 May23 ? 00:00:00 [kworker/0:0H] root 6 2 0 May23 ? 00:00:00 [mm_percpu_wq] root 7 2 0 May23 ? 00:00:04 [ksoftirqd/0] root 8 2 0 May23 ? 00:00:03 [rcu_sched] root 9 2 0 May23 ? 00:00:00 [rcu_bh] root 10 2 0 May23 ? 00:00:00 [migration/0] root 11 2 0 May23 ? 00:00:00 [watchdog/0] root 12 2 0 May23 ? 00:00:00 [cpuhp/0] root 13 2 0 May23 ? 00:00:00 [kdevtmpfs] root 14 2 0 May23 ? 00:00:00 [netns] root 15 2 0 May23 ? 00:00:00 [rcu_tasks_kthre] root 16 2 0 May23 ? 00:00:00 [kauditd] root 17 2 0 May23 ? 00:00:00 [khungtaskd] root 18 2 0 May23 ? 00:00:00 [oom_reaper] 。。。
實例4: ps 與grep 經常使用組合用法,查找特定進程
命令:
ps -ef|grep ssh
輸出:
gec@ubuntu:~/myshare$ ps -ef|grep bash gec 9448 79650 0 06:05 pts/4 00:00:00 grep --color=auto bash gec 79650 79575 0 03:49 pts/4 00:00:00 bash gec@ubuntu:~/myshare$ ps -ef | grep ssh gec 9452 79650 0 06:05 pts/4 00:00:00 grep --color=auto ssh root 16628 1 0 03:45 ? 00:00:00 /usr/sbin/sshd -D
將目前屬於您本身此次登入的 PID 與相關信息列示出來
命令:
ps -l
輸出:
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 R 1000 9455 79650 0 80 0 - 7657 - pts/4 00:00:00 ps 0 S 1000 79650 79575 0 80 0 - 6093 wait pts/4 00:00:00 bash
說明:
各相關信息的意義:
F 表明這個程序的旗標 (flag), 4 表明使用者爲 super user
S 表明這個程序的狀態 (STAT),關於各 STAT 的意義將在內文介紹
UID 程序被該 UID 所擁有
PID 就是這個程序的 ID !
PPID 則是其上級父程序的ID
C CPU 使用的資源百分比
PRI 這個是 Priority (優先執行序) 的縮寫,詳細後面介紹
NI 這個是 Nice 值,在下一小節咱們會持續介紹
ADDR 這個是 kernel function,指出該程序在內存的那個部分。若是是個 running的程序,通常就是 "-"
SZ 使用掉的內存大小
WCHAN 目前這個程序是否正在運做當中,若爲 - 表示正在運做
TTY 登入者的終端機位置
TIME 使用掉的 CPU 時間。
CMD 所下達的指令爲什麼
在預設的狀況下, ps 僅會列出與目前所在的 bash shell 有關的 PID 而已,因此, 當我使用 ps -l 的時候,只有三個 PID。
列出目前全部的正在內存當中的程序
命令:
ps aux
輸出:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.3 185228 3100 ? Ss May23 0:08 /lib/systemd/systemd --system --deserialize 21 root 2 0.0 0.0 0 0 ? S May23 0:00 [kthreadd] root 4 0.0 0.0 0 0 ? I< May23 0:00 [kworker/0:0H] root 6 0.0 0.0 0 0 ? I< May23 0:00 [mm_percpu_wq] root 7 0.0 0.0 0 0 ? S May23 0:04 [ksoftirqd/0] root 8 0.0 0.0 0 0 ? I May23 0:03 [rcu_sched] root 9 0.0 0.0 0 0 ? I May23 0:00 [rcu_bh] root 10 0.0 0.0 0 0 ? S May23 0:00 [migration/0] root 11 0.0 0.0 0 0 ? S May23 0:00 [watchdog/0]
USER:該 process 屬於那個使用者帳號的 PID :該 process 的號碼 %CPU:該 process 使用掉的 CPU 資源百分比 %MEM:該 process 所佔用的物理內存百分比 VSZ :該 process 使用掉的虛擬內存量 (Kbytes) RSS :該 process 佔用的固定的內存量 (Kbytes) TTY :該 process 是在那個終端機上面運做,若與終端機無關,則顯示 ?,另外, tty1-tty6 是本機上面的登入者程序,若爲 pts/0 等等的,則表示爲由網絡鏈接進主機的程序。 STAT:該程序目前的狀態,主要的狀態有 R :該程序目前正在運做,或者是可被運做 S :該程序目前正在睡眠當中 (可說是 idle 狀態),但可被某些訊號 (signal) 喚醒。 T :該程序目前正在偵測或者是中止了 Z :該程序應該已經終止,可是其父程序卻沒法正常的終止他,形成 zombie (疆屍) 程序的狀態 START:該 process 被觸發啓動的時間 TIME :該 process 實際使用 CPU 運做的時間 COMMAND:該程序的實際指令
列出相似程序樹的程序顯示
命令:
ps -axjf
輸出:
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 2 0 0 ? -1 S 0 0:00 [kthreadd] 2 4 0 0 ? -1 I< 0 0:00 \_ [kworker/0:0H] 2 6 0 0 ? -1 I< 0 0:00 \_ [mm_percpu_wq] 2 7 0 0 ? -1 S 0 0:04 \_ [ksoftirqd/0] 2 8 0 0 ? -1 R 0 0:03 \_ [rcu_sched] 2 9 0 0 ? -1 I 0 0:00 \_ [rcu_bh] 2 10 0 0 ? -1 S 0 0:00 \_ [migration/0] 2 11 0 0 ? -1 S 0 0:00 \_ [watchdog/0] 2 12 0 0 ? -1 S 0 0:00 \_ [cpuhp/0] 2 13 0 0 ? -1 S 0 0:00 \_ [kdevtmpfs] 2 14 0 0 ? -1 I< 0 0:00 \_ [netns] 2 15 0 0 ? -1 S 0 0:00 \_ [rcu_tasks_kthre] 2 16 0 0 ? -1 S 0 0:00 \_ [kauditd]
找出與 cron 與 syslog 這兩個服務有關的 PID 號碼
命令:ps aux | egrep '(cron|syslog)'
root 786 0.0 0.0 30748 508 ? Ss May23 0:00 /usr/sbin/cron -f syslog 788 0.0 0.0 256392 208 ? Ssl May23 0:00 /usr/sbin/rsyslogd -n gec 2147 0.0 0.0 436552 672 ? S<l May23 0:00 /usr/bin/pulseaudio --start --log-target=syslog gec 9483 0.0 0.1 15964 1032 pts/4 S+ 06:13 0:00 grep -E --color=auto (cron|syslog)
說明:
其餘實例:
1. 能夠用 | 管道和 more 鏈接起來分頁查看
命令:
ps -aux |more
2. 把全部進程顯示出來,並輸出到ps001.txt文件
命令:
ps -aux > ps001.txt
3. 輸出指定的字段
命令:
ps -o pid,ppid,pgrp,session,tpgid,comm
輸出: