歡迎光臨
每天分享高質量文章

8 個用於有效地管理行程的 Linux 命令 | Linux 中國

通過這些關鍵的命令來全程管理你的應用。
— Alan Formy-duval


致謝
編譯自 | 
https://opensource.com/article/18/9/linux-commands-process-management
 
 作者 | Alan Formy-duval
 譯者 | heguangzhi ??共計翻譯:2.0 篇 貢獻時間:7 天

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

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

啟動行程

啟動行程的最簡單方法是在命令列中鍵入其名稱,然後按回車鍵。如果要啟動 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"

現在,重覆您的 echo 和 which 命令或者嘗試檢查版本。容易多了!

  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:00 bash

  4. 24148 pts/0    00:00:00 ps

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

  1. alan@workstation:~$ ps -ef

  2. UID        PID  PPID  C STIME TTY          TIME CMD

  3. root         1     0  0 Aug18 ?        00:00:10 /sbin/init splash

  4. root         2     0  0 Aug18 ?        00:00:00 [kthreadd]

  5. root         4     2  0 Aug18 ?        00:00:00 [kworker/0:0H]

  6. root         6     2  0 Aug18 ?        00:00:00 [mm_percpu_wq]

  7. root         7     2  0 Aug18 ?        00:00:00 [ksoftirqd/0]

  8. root         8     2  0 Aug18 ?        00:00:20 [rcu_sched]

  9. root         9     2  0 Aug18 ?        00:00:00 [rcu_bh]

  10. root        10     2  0 Aug18 ?        00:00:00 [migration/0]

  11. root        11     2  0 Aug18 ?        00:00:00 [watchdog/0]

  12. root        12     2  0 Aug18 ?        00:00:00 [cpuhp/0]

  13. root        13     2  0 Aug18 ?        00:00:00 [cpuhp/1]

  14. root        14     2  0 Aug18 ?        00:00:00 [watchdog/1]

  15. root        15     2  0 Aug18 ?        00:00:00 [migration/1]

  16. root        16     2  0 Aug18 ?        00:00:00 [ksoftirqd/1]

  17. alan     20506 20496  0 10:39 pts/0    00:00:00 bash

  18. alan     20520  1454  0 10:39 ?        00:00:00 nginx: master process nginx

  19. alan     20521 20520  0 10:39 ?        00:00:00 nginx: worker process

  20. alan     20526 20506  0 10:39 pts/0    00:00:00 man ps

  21. alan     20536 20526  0 10:39 pts/0    00:00:00 pager

  22. alan     20564 20496  0 10:40 pts/1    00:00:00 bash

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

  1. alan@workstation:~$ ps -ef |grep nginx

  2. alan     20520  1454  0 10:39 ?        00:00:00 nginx: master process nginx

  3. alan     20521 20520  0 10: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  0 11:18 ?        00:00:00 nginx: master process ./nginx -p /home/alan/web/prod/nginxsec

  3. alan     20882 20881  0 11:18 ?        00:00:00 nginx: worker process

  4. alan     20895  1454  0 11:19 ?        00:00:00 nginx: master process nginx

  5. alan     20896 20895  0 11:19 ?        00:00:00 nginx: worker process

使用 grep 或 pgrep 將顯示 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. 20882 20881

  3. alan@workstation:~$ pidof /home/alan/web/prod/nginx/sbin/nginx

  4. 20896 20895

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.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

  4. KiB Mem : 16387132 total, 10854648 free,  1859036 used,  3673448 buff/cache

  5. KiB Swap:        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   0 3930764 247288  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.17 top

  10.     1 root      20   0  225564   9416   6768 S   0.0  0.1   0:10.72 systemd

  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.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

  4. KiB Mem : 16387132 total, 10856008 free,  1857648 used,  3673476 buff/cache

  5. KiB Swap:        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選項傳遞信號,如 stop 或 reload。通常,我更喜歡使用應用程式的特定方法來停止操作。然而,我將演示用 kill 命令來停止 Nginx 行程 20896,然後用 pgrep 確認它已經停止。PID 20896 就不再出現。

  1. alan@workstation:~$ kill -9 20896

  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 手冊頁[1]。雖然大多數這些命令都存在於 Linux、Solaris 和 BSD 等平臺上,但也有一些不同之處。在命令列工作或編寫腳本時,始終測試並隨時準備根據需要進行更正。


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

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

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

赞(0)

分享創造快樂

© 2021 知識星球   网站地图