練習 - 終止行為異常的程序

已完成

電腦並非完美無缺。 遲早會發生錯誤。 這就是您為何擁有系統管理員這份工作;由您決定是否要針對系統問題進行疑難排解和修正。

設想 Python 應用程式正在造成問題。 其或許佔用太多 CPU 時間,或可能已停止回應。 不論是哪一種情況,您都想要停止應用程式。 若要識別程序或應用程式,您可以使用 psgrep。 然後,若要予以停止,您可以使用 kill 命令。 讓我們在您的 Linux 虛擬機器中練習這項操作。

啟動行為異常的進程

如果您即將終止程序,您需要可終止的程序。 讓我們建立一個。

  1. 鍵入下列命令以回到您的基地:

    cd ~
    
  2. 在 Azure Cloud Shell 中,輸入下列命令以啟動 Linux 的 vi 編輯器:

    vi bad.py
    

    vi 是 Linux 繼承自 Unix 的廣泛使用文字編輯器。 不論是否接受,Bash 使用者都必須知道 vi 的基本概念。

  3. 選取 i 鍵,將 vi 置於插入模式。 然後鍵入下列 Python 程式:

    i = 0
    while i == 0:
        pass
    

    這個程式在執行時,會以無限迴圈的方式執行,顯然不是您想在伺服器上執行的方式。

  4. 選取 Esc 鍵以結束插入模式。 然後鍵入下列命令,後面接著 Enter 鍵以儲存程式並結束 vi

    :wq
    

    請務必在命令的開頭包含冒號。 至於命令的其餘部分,w 代表「寫入 (write)」,而 q 代表「結束 (quit)」。

  5. 現在使用下列命令來啟動程式,並使其在背景執行:

    python3 bad.py &
    

    請務必在命令的結尾包含連字號 (&。 否則,您不會返回 Bash 提示字元。 在 Bash 中,連字號會執行命令並返回命令列 (即使命令尚未完成執行)。

這並不明顯,但 bad.py 現在正在背景執行,並從其他程序竊取 CPU 週期。 讓我們仔細看看發生什麼事。

終止程序

若要刪除程序,您需要程序名稱或程序識別碼。 這是 ps 的作業。

  1. 若要重新整理您的記憶體,ps -ef 命令會列出所有執行中的程序,並顯示每個程序的大量相關資訊。 使用下列命令來列出所有執行中的程序,並將結果篩選為含有 "python" 的輸出行:

    ps -ef | grep python
    

    結果看起來應該像這樣:

    yourname+    342    254 99 23:34 pts/1    00:00:31 python3 bad.py
    yourname+    344    254  0 23:35 pts/1    00:00:00 grep --color=auto python
    
  2. 從清單看來,bad.py 耗用伺服器 99% 的 CPU 時間。 此程式真的名符其實。

    kill 命令會根據其程序識別碼來刪除執行中的程序。 (名為 killall 的相關命令會根據程序名稱來終止程序。)當您呼叫 kill 時,您必須決定要使用哪種「訊號」來終止程序。 使用下列命令來顯示訊號類型清單:

    kill -l
    
  3. 如果您要終止精靈程序 (在背景執行並為作業系統提供重要服務的程序),建議您將其終止並立即重新啟動。 若要這麼做,您可以使用 SIGHUP 訊號。

    在此範例中,您想要終止程序而不需重新啟動。 因此,您想使用與編號 9 對應的 SIGKILL 訊號。 為此目的,請從 ps -ef 輸出抓取 bad.py 的程序識別碼 (位於第二欄),然後使用下列命令來終止程序。 將 PROCESS_ID 取代為程序識別碼。

    kill -9 PROCESS_ID
    

    您也可將相同的命令輸入為 kill -s SIGKILL PROCESS_ID。 您可以自行決定要使用訊號的名稱或編號。

  4. 最後,再次執行 ps 以確認 bad.py 已不再執行。

pskill 的另一種常見用法是識別並終止「僵屍程序」,這是撰寫不良的程式所留下的子系程序。