08 - Commands - Process

擷取快照

ps [{OPTIONS}]

ps 是 process status 的縮寫。

常用的 Options

Option
Description

-a

顯示所有由使用者觸發的執行中的 processes,但不包含沒有 terminal 可以控制的 orphan process

-x

無論有沒有 terminal 可以控制的 processes 都顯示

-A

等同 -ax,也就是顯示由所有使用者所觸發的所有執行中的 processes,且包含沒有 terminal 可以控制的

完整顯視所有執行中的 Processes

ps aux

ps aux 顯示的資訊會比 ps -Aps -ax 更完整。

只顯示部分欄位

e.g. 只顯示 pid 與指令

ps axo pid,args

ps 與其它指令搭配

e.g. 列出所有指令中包含 "gunicorn" 這個字的 processes:

ps aux | grep gunicorn

只顯示由當前 Shell 所管理的 Jobs

jobs

[!Info] Job vs. Process 一個 job 可能由一個或多個 processes 組成。想了解關於 job 的詳細介紹可以看這篇

觀察即時狀態

top
# or
htop

ps 只能在下指令的當下取一張 snapshot,若要動態監控系統資源使用狀況的即時狀態,就需要使用 top

htoptop 的功能幾乎相同,只是 htop 長得比較漂亮,要使用的話須另外安裝(brew install htop)。

查詢 Processes

lsof [{OPTIONS}] [{PATH_TO_DIR}]

lsof 是 "list open file" 的縮寫。

在 Linux 中,所有執行中的 processes 都有一個對應的「檔案」,processes 也會開啟一些檔案,這些檔案會被放在 /proc 底下,而 lsof 的功能就是列出這些被 processes 開啟的檔案,所以可以用來得知執行中的 processes 使用了哪些系統資源。

常用的 Options

  • -c {PROGRAM_NAME}|{APP_NAME}[,...]

    列出所有與指定應用程式相關的 process files。

  • -u {USERNAME}[,...]

    列出所有指定 user 觸發的 process files。

  • -p {PID}[,...]

    列出所有與指定 pid 有關的 process files。

  • -i [4|6][TCP|UDP][@{HOSTNAME}|{HOSTADDR}][:{SERVICE}|{PORT}]

    列出所有與指定網路位置有關的 process files。

    [4|6] 用來指定 IP version,分別代表 IPv4 與 IPv6,不填就代表都要。

使用多個 options 做為篩選 process files 的條件時,預設的行為是將這些條件的結果進行 "OR" 運算(取聯集),==若要取交集則要在最前面加上 -a options==。

終止 Process

kill [{SIGNAL}] {PID}
# or
kill [{SIGNAL}] %{JOB_ID}
Signal
效果

-2

Gracefully terminate a process running in the foreground,效果等同於在正在執行該 process/job 的終端機上使用鍵盤 Ctrl + C 進行 interrupt

-9

強制終止 process

-15

Gracefully terminate a process,這是預設值

關於 Unix signal 的詳細介紹請看這篇

與其它指令搭配

e.g. Gracefully restart Gunicorn:

ps aux | grep gunicorn | grep projectname | awk '{ print $2 }' | xargs kill -HUP

一次刪除多個 Processes

killall [{OPTIONS}] [{PROCESS_NAME_PATTERN}]

這個指令是用 process name 而非 pid 來指定要刪除的 processes。

通常這個指令用來一次刪除多個「符合條件」的 processes,比如下面這個例子就是刪除所有「名字以 System 開頭的 processes」:

killall System

常用的 Options

Option
Short
Description

--exact

-e

名稱須完全比對成功才會終止

--ignore-case

-I

忽略名稱的大小寫

--interactive

-i

終止 process 之前先詢問

--list

-l

列出所有的 signal 名稱

--regexp

-r

使用 regex 指定 process 名稱

--signal

-s

指定終止 processes 的 signal

--user

-u

終止指定使用者所執行的 processes

--older-than

-o

開始執行的時間點在指定時間點之前的 processes 都刪除

--younger-than

-y

開始執行的時間點在指定時間點之後的 processes 都刪除

Process Priority

在 Linux 系統中,各個 processes 可能會有不同的執行優先度(priority/niceness),優先度越高的 process 會被分配到越多比例的 CPU time,優先度以整數 -20~19 表示,==數字越小優先度越高==。

先設置 Priority 再執行指令

使用 nice 可以在一個 command (process)「尚未開始執行前」先為其設置 priority,然後再執行 command:

nice -n {NICENESS} {COMMAND}

舉例而言,若準備要執行 wget https://wordpress.org/latest.zip,但想先將這個指令的 priority 設為 5,可以這樣寫:

nice -n 5 wget https://wordpress.org/latest.zip

若想將 priority 設為小於 0 的數字,則須擁有 root 權限:

sudo nice -n -1 wget https://wordpress.org/latest.zip

一旦 process 開始執行後就不能再用 nice 設置 priority,若想要在 process 執行的過程中調整 priority,則須使用 renice

調整 Process Priority

# 調整指定 pid
sudo renice -n {NICENES} -p {PID}

# 調整由指定 user 所觸發的 processes
sudo renice -n {NICENESS} -u {USERNAME}

# 調整由指定 group 中的任一 user 所觸發的 processes
sudo renice -n {NICENESS} -g {GROUP}
  • 若要使用 renice 調整 process priority,須先取得 root 的權限

查看 Priority

ps -l
# or
top

參考資料

Last updated