首頁 > 軟體

8 個用於有效地管理進程的 Linux 命令

2020-06-16 16:46:02

通過這些關鍵的命令來全程管理你的應用。

一般來說,應用程式進程的生命週期有三種主要狀態:啟動、執行和停止。如果我們想成為稱職的管理員,每個狀態都可以而且應該得到認真的管理。這八個命令可用於管理進程的整個生命週期。

 

啟動進程

啟動進程的最簡單方法是在命令列中鍵入其名稱,然後按確認鍵。如果要啟動 Nginx web 伺服器,請鍵入 nginx 。也許您只是想看看其版本。

  1. alan@workstation:~$ nginx
  2. alan@workstation:~$ nginx -v
  3. nginx version: nginx/1.14.0

 

檢視您的可執行路徑

以上啟動進程的演示是假設可執行檔案位於您的可執行路徑中。理解這個路徑是可靠地啟動和管理進程的關鍵。管理員通常會為他們想要的目的客製化這條路徑。您可以使用 echo $PATH 檢視您的可執行路徑。

  1. alan@workstation:~$ echo $PATH
  2. /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

 

WHICH

使用 which 命令檢視可執行檔案的完整路徑。

  1. alan@workstation:~$ which nginx
  2. /opt/nginx/bin/nginx

我將使用流行的 web 伺服器軟體 Nginx 作為我的例子。假設安裝了 Nginx。如果執行 which nginx 的命令什麼也不返回,那麼是找不到 Nginx 了,因為它只搜尋您指定的可執行路徑。有三種方法可以補救一個進程不能簡單地通過名字啟動的情況。首先是鍵入完整路徑 —— 雖然,我不情願輸入全部路徑,您會嗎?

  1. alan@workstation:~$ /home/alan/web/prod/nginx/sbin/nginx -v
  2. nginx version: nginx/1.14.0

第二個解決方案是將應用程式安裝在可執行檔案路徑中的目錄中。然而,這有時可能是辦不到的,特別是如果您沒有 root 許可權。

第三個解決方案是更新您的可執行路徑環境變數,包括要使用的特定應用程式的安裝目錄。這個解決方案是與 shell 相關的。例如,Bash 使用者需要在他們的 .bashrc 檔案中編輯 PATH= 行。

  1. PATH="$HOME/web/prod/nginx/sbin:$PATH"

現在,重複您的 echowhich 命令或者嘗試檢查版本。容易多了!

  1. alan@workstation:~$ echo $PATH
  2. /home/alan/web/prod/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
  3. alan@workstation:~$ which nginx
  4. /home/alan/web/prod/nginx/sbin/nginx
  5. alan@workstation:~$ nginx -v                                                
  6. nginx version: nginx/1.14.0

 

保持進程執行

 

NOHUP

登出或關閉終端時,進程可能不會繼續執行。這種特殊情況可以通過在要使用 nohup 命令放在要執行的命令前面讓進程持續執行。此外,附加一個& 符號將會把進程傳送到後台,並允許您繼續使用終端。例如,假設您想執行 myprogram.sh

  1. nohup myprogram.sh &

nohup 會返回執行進程的 PID。接下來我會更多地談論 PID。

 

管理正在執行的進程

每個進程都有一個唯一的進程標識號 (PID) 。這個數位是我們用來管理每個進程的。我們還可以使用進程名稱,我將在下面演示。有幾個命令可以檢查正在執行的進程的狀態。讓我們快速看看這些命令。

 

PS

最常見的是 ps 命令。ps 的預設輸出是當前終端中執行的進程的簡單列表。如下所示,第一列包含 PID。

  1. alan@workstation:~$ ps
  2. PID TTY          TIME CMD
  3. 23989 pts/0    00:00:00bash
  4. 24148 pts/0    00:00:00ps

我想看看我之前啟動的 Nginx 進程。為此,我告訴 ps 給我展示每一個正在執行的進程(-e)和完整的列表(-f)。

  1. alan@workstation:~$ ps-ef
  2. UID        PID  PPID  C STIME TTY          TIME CMD
  3. root         1     0  0Aug18?        00:00:10/sbin/init splash
  4. root         2     0  0Aug18?        00:00:00[kthreadd]
  5. root         4     2  0Aug18?        00:00:00[kworker/0:0H]
  6. root         6     2  0Aug18?        00:00:00[mm_percpu_wq]
  7. root         7     2  0Aug18?        00:00:00[ksoftirqd/0]
  8. root         8     2  0Aug18?        00:00:20[rcu_sched]
  9. root         9     2  0Aug18?        00:00:00[rcu_bh]
  10. root        10     2  0Aug18?        00:00:00[migration/0]
  11. root        11     2  0Aug18?        00:00:00[watchdog/0]
  12. root        12     2  0Aug18?        00:00:00[cpuhp/0]
  13. root        13     2  0Aug18?        00:00:00[cpuhp/1]
  14. root        14     2  0Aug18?        00:00:00[watchdog/1]
  15. root        15     2  0Aug18?        00:00:00[migration/1]
  16. root        16     2  0Aug18?        00:00:00[ksoftirqd/1]
  17. alan     2050620496  010:39 pts/0    00:00:00bash
  18. alan     20520  1454  010:39?        00:00:00 nginx: master process nginx
  19. alan     2052120520  010:39?        00:00:00 nginx: worker process
  20. alan     2052620506  010:39 pts/0    00:00:00manps
  21. alan     2053620526  010:39 pts/0    00:00:00 pager
  22. alan     2056420496  010:40 pts/1    00:00:00bash

您可以在上面 ps 命令的輸出中看到 Nginx 進程。這個命令顯示了將近 300 行,但是我在這個例子中縮短了它。可以想象,試圖處理 300 行過程資訊有點混亂。我們可以將這個輸出輸送到 grep,過濾一下僅顯示 nginx。

  1. alan@workstation:~$ ps-ef |grep nginx
  2. alan     20520  1454  010:39?        00:00:00 nginx: master process nginx
  3. alan     2052120520  010:39?        00:00:00 nginx: worker process

確實更好了。我們可以很快看到,Nginx 有 20520 和 20521 的 PID。

 

PGREP

pgrep 命令更加簡化單獨呼叫 grep 遇到的問題。

  1. alan@workstation:~$ pgrep nginx
  2. 20520
  3. 20521

假設您在一個託管環境中,多個使用者正在執行幾個不同的 Nginx 範例。您可以使用 -u 選項將其他人排除在輸出之外。

  1. alan@workstation:~$ pgrep-u alan nginx
  2. 20520
  3. 20521

 

PIDOF

另一個好用的是 pidof。此命令將檢查特定二進位制檔案的 PID,即使另一個同名進程正在執行。為了建立一個例子,我將我的 Nginx 複製到第二個目錄,並以相應的路徑字首啟動。在現實生活中,這個範例可能位於不同的位置,例如由不同使用者擁有的目錄。如果我執行兩個 Nginx 範例,則pidof 輸出顯示它們的所有進程。

  1. alan@workstation:~$ ps-ef |grep nginx
  2. alan     20881  1454  011:18?        00:00:00 nginx: master process ./nginx -p /home/alan/web/prod/nginxsec
  3. alan     2088220881  011:18?        00:00:00 nginx: worker process
  4. alan     20895  1454  011:19?        00:00:00 nginx: master process nginx
  5. alan     2089620895  011:19?        00:00:00 nginx: worker process

使用 greppgrep 將顯示 PID 數位,但我們可能無法辨別哪個範例是哪個。

  1. alan@workstation:~$ pgrep nginx
  2. 20881
  3. 20882
  4. 20895
  5. 20896

pidof 命令可用於確定每個特定 Nginx 範例的 PID。

  1. alan@workstation:~$ pidof/home/alan/web/prod/nginxsec/sbin/nginx
  2. 2088220881
  3. alan@workstation:~$ pidof/home/alan/web/prod/nginx/sbin/nginx
  4. 2089620895

 

TOP

top 命令已經有很久的歷史了,對於檢視執行進程的細節和快速識別記憶體消耗等問題是非常有用的。其預設檢視如下所示。

  1. top-11:56:28 up 1 day,13:37,  1 user,  load average:0.09,0.04,0.03
  2. Tasks:292 total,   3 running,225 sleeping,   0 stopped,   0 zombie
  3. %Cpu(s):  0.1 us,  0.2 sy,  0.0 ni,99.7id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
  4. KiBMem:16387132 total,10854648 free,  1859036 used,  3673448 buff/cache
  5. KiBSwap:        0 total,        0 free,        0 used.14176540 avail Mem
  6.   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  7. 17270 alan      20   03930764247288  98992 R   0.7  1.5   5:58.22 gnome-shell
  8. 20496 alan      20   0  816144  45416  29844 S   0.5  0.3   0:22.16 gnome-terminal-
  9. 21110 alan      20   0   41940   3988   3188 R   0.1  0.0   0:00.17top
  10.     1 root      20   0  225564   9416   6768 S   0.0  0.1   0:10.72systemd
  11.     2 root      20   0       0      0      0 S   0.0  0.0   0:00.01 kthreadd
  12.     4 root       0-20       0      0      0 I   0.0  0.0   0:00.00 kworker/0:0H
  13.     6 root       0-20       0      0      0 I   0.0  0.0   0:00.00 mm_percpu_wq
  14.     7 root      20   0       0      0      0 S   0.0  0.0   0:00.08 ksoftirqd/0

可以通過鍵入字母 s 和您喜歡的更新秒數來更改更新間隔。為了更容易監控我們的範例 Nginx 進程,我們可以使用 -p 選項並傳遞 PID 來呼叫 top。這個輸出要乾淨得多。

  1. alan@workstation:~$ top-p20881 -p20882 -p20895 -p20896
  2. Tasks:   4 total,   0 running,   4 sleeping,   0 stopped,   0 zombie
  3. %Cpu(s):  2.8 us,  1.3 sy,  0.0 ni,95.9id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
  4. KiBMem:16387132 total,10856008 free,  1857648 used,  3673476 buff/cache
  5. KiBSwap:        0 total,        0 free,        0 used.14177928 avail Mem
  6.   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  7. 20881 alan      20   0   12016    348      0 S   0.0  0.0   0:00.00 nginx
  8. 20882 alan      20   0   12460   1644    932 S   0.0  0.0   0:00.00 nginx
  9. 20895 alan      20   0   12016    352      0 S   0.0  0.0   0:00.00 nginx
  10. 20896 alan      20   0   12460   1628    912 S   0.0  0.0   0:00.00 nginx

在管理進程,特別是終止進程時,正確確定 PID 是非常重要。此外,如果以這種方式使用 top,每當這些進程中的一個停止或一個新進程開始時,top 都需要被告知有新的進程。

 

終止進程

 

KILL

有趣的是,沒有 stop 命令。在 Linux 中,有 kill 命令。kill 用於向進程傳送信號。最常用的信號是“終止”(SIGTERM)或“殺死”(SIGKILL)。然而,還有更多。下面是一些例子。完整的列表可以用 kill -L 顯示。

  1.  1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
  2.  6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
  3. 11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM

注意第 9 號信號是 SIGKILL,通常,我們會發出比如 kill -9 20896 這樣的命令。預設信號是 15,這是 SIGTERM。請記住,許多應用程式都有自己的停止方法。Nginx 使用 -s 選項傳遞信號,如 stopreload。通常,我更喜歡使用應用程式的特定方法來停止操作。然而,我將演示用 kill 命令來停止 Nginx 進程 20896,然後用 pgrep 確認它已經停止。PID 20896 就不再出現。

  1. alan@workstation:~$ kill-920896
  2.  
  3. alan@workstation:~$ pgrep nginx
  4. 20881
  5. 20882
  6. 20895
  7. 22123

 

PKILL

命令 pkill 類似於 pgrep,因為它可以按名稱搜尋。這意味著在使用 pkill 時必須非常小心。在我的 Nginx 範例中,如果我只想殺死一個 Nginx 範例,我可能不會選擇使用它。我可以將 Nginx 選項 -s stop 傳遞給特定的範例來消除它,或者我需要使用 grep 來過濾整個 ps 輸出。

  1. /home/alan/web/prod/nginx/sbin/nginx -s stop
  2. /home/alan/web/prod/nginxsec/sbin/nginx -s stop

如果我想使用 pkill,我可以包括 -f 選項,讓 pkill 過濾整個命令列引數。這當然也適用於 pgrep。所以,在執行 pkill -f 之前,首先我可以用 pgrep -a 確認一下。

  1. alan@workstation:~$ pgrep-a nginx
  2. 20881 nginx: master process ./nginx -p /home/alan/web/prod/nginxsec
  3. 20882 nginx: worker process
  4. 20895 nginx: master process nginx
  5. 20896 nginx: worker process

我也可以用 pgrep -f 縮小我的結果。pkill 使用相同引數會停止該進程。

  1. alan@workstation:~$ pgrep-f nginxsec
  2. 20881
  3.                                            
  4. alan@workstation:~$ pkill-f nginxsec

pgrep(尤其是 pkill)要記住的關鍵點是,您必須始終確保搜尋結果準確性,這樣您就不會無意中影響到錯誤的進程。

大多數這些命令都有許多命令列選項,所以我總是建議閱讀每一個命令的 man 手冊頁。雖然大多數這些命令都存在於 Linux、Solaris 和 BSD 等平台上,但也有一些不同之處。在命令列工作或編寫指令碼時,始終測試並隨時準備根據需要進行更正。


via: https://opensource.com/article/18/9/linux-commands-process-management

作者:Alan Formy-Duval 選題:lujun9972 譯者:heguangzhi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新連結地址https://www.linuxidc.com/Linux/2018-09/154146.htm


IT145.com E-mail:sddin#qq.com