有效管理進程的幾個linux命令

  通常來講,應用程序進程的生命週期有三種主要狀態:啓動、運行和中止。若是咱們想成爲稱職的管理員,每一個狀態均可以並且應該獲得認真的管理。這八個命令可用於管理進程的整個生命週期。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)要記住的關鍵點是,您必須始終確保搜索結果準確性,這樣您就不會無心中影響到錯誤的進程。

 

原文:8個有效管理進程的linux命令

相關文章
相關標籤/搜索