自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

[[243868]]

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

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

啟動進程

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

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

查看您的可執(zhí)行路徑

以上啟動進程的演示是假設可執(zhí)行文件位于您的可執(zhí)行路徑中。理解這個路徑是可靠地啟動和管理進程的關鍵。管理員通常會為他們想要的目的定制這條路徑。您可以使用 echo $PATH 查看您的可執(zhí)行路徑。

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

WHICH

使用 which 命令查看可執(zhí)行文件的完整路徑。

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

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

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

第二個解決方案是將應用程序安裝在可執(zhí)行文件路徑中的目錄中。然而,這有時可能是辦不到的,特別是如果您沒有 root 權限。

第三個解決方案是更新您的可執(zhí)行路徑環(huán)境變量,包括要使用的特定應用程序的安裝目錄。這個解決方案是與 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.  
  4. alan@workstation:~$ which nginx
  5. /home/alan/web/prod/nginx/sbin/nginx
  6.  
  7. alan@workstation:~$ nginx -v                                                
  8. nginx version: nginx/1.14.0 

保持進程運行 

NOHUP

注銷或關閉終端時,進程可能不會繼續(xù)運行。這種特殊情況可以通過在要使用 nohup 命令放在要運行的命令前面讓進程持續(xù)運行。此外,附加一個& 符號將會把進程發(fā)送到后臺,并允許您繼續(xù)使用終端。例如,假設您想運行 myprogram.sh 。

  1. nohup myprogram.sh &

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

管理正在運行的進程

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

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

假設您在一個托管環(huán)境中,多個用戶正在運行幾個不同的 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

使用 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. 20882 20881
  3.  
  4. alan@workstation:~$ pidof /home/alan/web/prod/nginx/sbin/nginx
  5. 20896 20895 

TOP

top 命令已經有很久的歷史了,對于查看運行進程的細節(jié)和快速識別內存消耗等問題是非常有用的。其默認視圖如下所示。

  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.  
  7.   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  8. 17270 alan      20   0 3930764 247288  98992 R   0.7  1.5   5:58.22 gnome-shell
  9. 20496 alan      20   0  816144  45416  29844 S   0.5  0.3   0:22.16 gnome-terminal-
  10. 21110 alan      20   0   41940   3988   3188 R   0.1  0.0   0:00.17 top
  11.     1 root      20   0  225564   9416   6768 S   0.0  0.1   0:10.72 systemd
  12.     2 root      20   0       0      0      0 S   0.0  0.0   0:00.01 kthreadd
  13.     4 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 kworker/0:0H
  14.     6 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 mm_percpu_wq
  15.     7 root      20   0       0      0      0 S   0.0  0.0   0:00.08 ksoftirqd/0

可以通過鍵入字母 s 和您喜歡的更新秒數來更改更新間隔。為了更容易監(jiān)控我們的示例 Nginx 進程,我們可以使用 -p 選項并傳遞 PID 來調用 top。這個輸出要干凈得多。

  1. alan@workstation:~$ top -p20881 -p20882 -p20895 -p20896
  2.  
  3. Tasks:   4 total,   0 running,   4 sleeping,   0 stopped,   0 zombie
  4. %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
  5. KiB Mem : 16387132 total, 10856008 free,  1857648 used,  3673476 buff/cache
  6. KiB Swap:        0 total,        0 free,        0 used. 14177928 avail Mem
  7.  
  8.   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  9. 20881 alan      20   0   12016    348      0 S   0.0  0.0   0:00.00 nginx
  10. 20882 alan      20   0   12460   1644    932 S   0.0  0.0   0:00.00 nginx
  11. 20895 alan      20   0   12016    352      0 S   0.0  0.0   0:00.00 nginx
  12. 20896 alan      20   0   12460   1628    912 S   0.0  0.0   0:00.00 nginx

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

終止進程 

KILL

有趣的是,沒有 stop 命令。在 Linux 中,有 kill 命令。kill 用于向進程發(fā)送信號。最常用的信號是“終止”(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,通常,我們會發(fā)出比如 kill -9 20896 這樣的命令。默認信號是 15,這是 SIGTERM。請記住,許多應用程序都有自己的停止方法。Nginx 使用 -s 選項傳遞信號,如 stopreload。通常,我更喜歡使用應用程序的特定方法來停止操作。然而,我將演示用 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。所以,在執(zhí)行 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 等平臺上,但也有一些不同之處。在命令行工作或編寫腳本時,始終測試并隨時準備根據需要進行更正。

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2020-07-30 11:41:52

IT團隊遠程工作CIO

2019-05-09 14:32:13

IT中斷災難恢復攻擊

2011-11-02 09:54:37

測試

2017-07-07 08:46:51

災難恢復架構

2012-09-28 15:06:43

2017-07-12 12:43:42

數據庫SQL

2013-06-04 10:35:55

虛擬化IT系統

2019-02-28 07:34:56

欺騙勒索軟件攻擊

2009-02-27 14:21:01

LinuxRuby系統管理

2020-10-22 09:09:42

存儲硬件

2009-10-13 15:38:04

CMDB

2009-09-11 10:34:53

CCIE知識點CCIE

2021-01-22 15:39:51

區(qū)塊鏈比特幣貨幣

2021-12-12 21:36:04

Java開發(fā)代碼

2015-07-21 16:06:49

Linux進程管理命令

2018-11-26 07:23:08

數據數據分析

2024-03-05 13:47:24

云計算容器服務

2023-12-06 13:49:00

低代碼開發(fā)

2016-12-12 19:55:42

數據混淆數據泄露

2017-04-28 09:04:32

移動應用開發(fā)反饋
點贊
收藏

51CTO技術棧公眾號