通常來講,應用程序進程的生命週期有三種主要狀態:啓動、運行和中止。若是咱們想成爲稱職的管理員,每一個狀態均可以並且應該獲得認真的管理。這八個命令可用於管理進程的整個生命週期。html
啓動進程的最簡單方法是在命令行中鍵入其名稱,而後按回車鍵。若是要啓動 Nginx web 服務器,請鍵入 nginx 。也許您只是想看看其版本。linux
alan@workstation:~$ nginx alan@workstation:~$ nginx -v nginx version: nginx/1.14.0
查看您的可執行路徑nginx
以上啓動進程的演示是假設可執行文件位於您的可執行路徑中。理解這個路徑是可靠地啓動和管理進程的關鍵。管理員一般會爲他們想要的目的定製這條路徑。您可使用 echo $PATH 查看您的可執行路徑。web
alan@workstation:~$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
WHICHshell
使用 which 命令查看可執行文件的完整路徑。bash
alan@workstation:~$ which nginx /opt/nginx/bin/nginx
我將使用流行的 web 服務器軟件 Nginx 做爲個人例子。假設安裝了 Nginx。若是執行 which nginx 的命令什麼也不返回,那麼是找不到 Nginx 了,由於它只搜索您指定的可執行路徑。有三種方法能夠補救一個進程不能簡單地經過名字啓動的狀況。首先是鍵入完整路徑 —— 雖然,我不情願輸入所有路徑,您會嗎?服務器
alan@workstation:~$ /home/alan/web/prod/nginx/sbin/nginx -v nginx version: nginx/1.14.0
第二個解決方案是將應用程序安裝在可執行文件路徑中的目錄中。然而,這有時多是辦不到的,特別是若是您沒有 root 權限。spa
第三個解決方案是更新您的可執行路徑環境變量,包括要使用的特定應用程序的安裝目錄。這個解決方案是與 shell 相關的。例如,Bash 用戶須要在他們的 .bashrc 文件中編輯 PATH= 行。命令行
PATH="$HOME/web/prod/nginx/sbin:$PATH"
如今,重複您的 echo 和 which 命令或者嘗試檢查版本。容易多了!code
alan@workstation:~$ echo $PATH /home/alan/web/prod/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin alan@workstation:~$ which nginx /home/alan/web/prod/nginx/sbin/nginx alan@workstation:~$ nginx -v nginx version: nginx/1.14.0
保持進程運行
NOHUP
註銷或關閉終端時,進程可能不會繼續運行。這種特殊狀況能夠經過在要使用 nohup 命令放在要運行的命令前面讓進程持續運行。此外,附加一個& 符號將會把進程發送到後臺,並容許您繼續使用終端。例如,假設您想運行 myprogram.sh 。
nohup myprogram.sh &
nohup 會返回運行進程的 PID。接下來我會更多地談論 PID。
管理正在運行的進程
每一個進程都有一個惟一的進程標識號 (PID) 。這個數字是咱們用來管理每一個進程的。咱們還可使用進程名稱,我將在下面演示。有幾個命令能夠檢查正在運行的進程的狀態。讓咱們快速看看這些命令。
PS
最多見的是 ps 命令。ps 的默認輸出是當前終端中運行的進程的簡單列表。以下所示,第一列包含 PID。
alan@workstation:~$ ps PID TTY TIME CMD 23989 pts/0 00:00:00 bash 24148 pts/0 00:00:00 p
我想看看我以前啓動的 Nginx 進程。爲此,我告訴 ps 給我展現每個正在運行的進程(-e)和完整的列表(-f)。
您能夠在上面 ps 命令的輸出中看到 Nginx 進程。這個命令顯示了將近 300 行,可是我在這個例子中縮短了它。能夠想象,試圖處理 300 行過程信息有點混亂。咱們能夠將這個輸出輸送到 grep,過濾一下僅顯示 nginx。
確實更好了。咱們能夠很快看到,Nginx 有 20520 和 20521 的 PID。
PGREP
pgrep 命令更加簡化單獨調用 grep 遇到的問題。
alan@workstation:~$ pgrep nginx 20520 20521
假設您在一個託管環境中,多個用戶正在運行幾個不一樣的 Nginx 實例。您可使用 -u 選項將其餘人排除在輸出以外。
alan@workstation:~$ pgrep -u alan nginx 20520 20521
PIDOF
另外一個好用的是 pidof。此命令將檢查特定二進制文件的 PID,即便另外一個同名進程正在運行。爲了創建一個例子,我將個人 Nginx 複製到第二個目錄,並以相應的路徑前綴啓動。在現實生活中,這個實例可能位於不一樣的位置,例如由不一樣用戶擁有的目錄。若是我運行兩個 Nginx 實例,則pidof 輸出顯示它們的全部進程。
使用 grep 或 pgrep 將顯示 PID 數字,但咱們可能沒法辨別哪一個實例是哪一個。
alan@workstation:~$ pgrep nginx 20881 20882 20895 20896
pidof 命令可用於肯定每一個特定 Nginx 實例的 PID。
alan@workstation:~$ pidof /home/alan/web/prod/nginxsec/sbin/nginx 20882 20881 alan@workstation:~$ pidof /home/alan/web/prod/nginx/sbin/nginx 20896 20895
TOP
top 命令已經有好久的歷史了,對於查看運行進程的細節和快速識別內存消耗等問題是很是有用的。其默認視圖以下所示。
能夠經過鍵入字母 s 和您喜歡的更新秒數來更改更新間隔。爲了更容易監控咱們的示例 Nginx 進程,咱們可使用 -p 選項並傳遞 PID 來調用 top。這個輸出要乾淨得多。
在管理進程,特別是終止進程時,正確肯定 PID 是很是重要。此外,若是以這種方式使用 top,每當這些進程中的一箇中止或一個新進程開始時,top 都須要被告知有新的進程。
終止進程
KILL
沒有 stop 命令。在 Linux 中,有 kill 命令。kill 用於向進程發送信號。最經常使用的信號是「終止」(SIGTERM)或「殺死」(SIGKILL)。然而,還有更多。下面是一些例子。完整的列表能夠用 kill -L 顯示。
注: 9 號信號是 SIGKILL,一般,咱們會發出好比 kill -9 20896 這樣的命令。默認信號是 15,這是 SIGTERM。請記住,許多應用程序都有本身的中止方法。Nginx 使用 -s 選項傳遞信號,如 stop 或 reload。一般,我更喜歡使用應用程序的特定方法來中止操做。然而,我將演示用 kill 命令來中止 Nginx 進程 20896,而後用 pgrep 確認它已經中止。PID 20896 就再也不出現。
alan@workstation:~$ kill -9 20896 alan@workstation:~$ pgrep nginx 20881 20882 20895 22123
PKILL
命令 pkill 相似於 pgrep,由於它能夠按名稱搜索。這意味着在使用 pkill 時必須很是當心。在個人 Nginx 示例中,若是我只想殺死一個 Nginx 實例,我可能不會選擇使用它。我能夠將 Nginx 選項 -s stop 傳遞給特定的實例來消除它,或者我須要使用 grep 來過濾整個 ps 輸出。
/home/alan/web/prod/nginx/sbin/nginx -s stop /home/alan/web/prod/nginxsec/sbin/nginx -s stop
若是我想使用 pkill,我能夠包括 -f 選項,讓 pkill 過濾整個命令行參數。這固然也適用於 pgrep。因此,在執行 pkill -f 以前,首先我能夠用 pgrep -a 確認一下。
alan@workstation:~$ pgrep -a nginx 20881 nginx: master process ./nginx -p /home/alan/web/prod/nginxsec 20882 nginx: worker process 20895 nginx: master process nginx 20896 nginx: worker process
我也能夠用 pgrep -f 縮小個人結果。pkill 使用相同參數會中止該進程。
alan@workstation:~$ pgrep -f nginxsec 20881 alan@workstation:~$ pkill -f nginxsec
pgrep(尤爲是 pkill)要記住的關鍵點是,您必須始終確保搜索結果準確性,這樣您就不會無心中影響到錯誤的進程。