1. 程式人生 > >管理程序的 Linux 命令

管理程序的 Linux 命令

一、啟動程序

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

[email protected]:~$ nginx -v
nginx version: nginx/1.14.0

二、檢視您的可執行路徑

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

[email protected]:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

三、WHICH

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

[email protected]:~$ which nginx
/opt/nginx/bin/nginx

四、保持程序執行

NOHUP

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

nohup myprogram.sh &
nohup 會返回執行程序的 PID。

五、管理正在執行的程序

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

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

[email protected]:~$ ps
PID TTY          TIME  CMD
23989 pts/0    00:00:00 bash
24148 pts/0    00:00:00 ps

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

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

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

[email protected]:~$ ps-ef |grep nginx
alan     20520  1454  010:39?        00:00:00 nginx: master process nginx
alan     2052120520  010:39?        00:00:00 nginx: worker process

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

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

[email protected]:~$ pgrep nginx
20520
20521

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

[email protected]:~$ pgrep -u alan nginx
20520
20521

3、PIDOF

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

[email protected]:~$ ps-ef |grep nginx
alan     20881  1454  011:18?        00:00:00 nginx: master process ./nginx -p /home/alan/web/prod/nginxsec
alan     2088220881  011:18?        00:00:00 nginx: worker process
alan     20895  1454  011:19?        00:00:00 nginx: master process nginx
alan     2089620895  011:19?        00:00:00 nginx: worker process

使用 grep 或 pgrep 將顯示 PID 數字,但我們可能無法辨別哪個例項是哪個。

[email protected]:~$ pgrep nginx
20881
20882
20895
20896

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

[email protected]:~$ pidof/home/alan/web/prod/nginxsec/sbin/nginx
2088220881
[email protected]:~$ pidof/home/alan/web/prod/nginx/sbin/nginx
2089620895

4、TOP

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

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

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

[email protected]:~$ top -p20881 -p20882 -p20895 -p20896
Tasks:   4 total,   0 running,   4 sleeping,   0 stopped,   0 zombie
%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
KiBMem:16387132 total,10856008 free,  1857648 used,  3673476 buff/cache
KiBSwap:        0 total,        0 free,        0 used.14177928 avail Mem
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
20881 alan      20   0   12016    348      0 S   0.0  0.0   0:00.00 nginx
20882 alan      20   0   12460   1644    932 S   0.0  0.0   0:00.00 nginx
20895 alan      20   0   12016    352      0 S   0.0  0.0   0:00.00 nginx
20896 alan      20   0   12460   1628    912 S   0.0  0.0   0:00.00 nginx

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

六、終止程序

1、KILL

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

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
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 就不再出現。

[email protected]:~$ kill -9 20896

[email protected]:~$ pgrep nginx
20881
20882
20895
22123

2、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 確認一下。

[email protected]:~$ 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 使用相同引數會停止該程序。

[email protected]:~$ pgrep-f nginxsec
20881
                                           
[email protected]:~$ pkill-f nginxsec

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