練習 - 終止行為異常的程序
電腦並非完美無缺。 遲早會發生錯誤。 這就是您為何擁有系統管理員這份工作;由您決定是否要針對系統問題進行疑難排解和修正。
設想 Python 應用程式正在造成問題。 其或許佔用太多 CPU 時間,或可能已停止回應。 不論是哪一種情況,您都想要停止應用程式。 若要識別程序或應用程式,您可以使用 ps
和 grep
。 然後,若要予以停止,您可以使用 kill
命令。 讓我們在您的 Linux 虛擬機器中練習這項操作。
啟動行為異常的進程
如果您即將終止程序,您需要可終止的程序。 讓我們建立一個。
鍵入下列命令以回到您的基地:
cd ~
在 Azure Cloud Shell 中,輸入下列命令以啟動 Linux 的
vi
編輯器:vi bad.py
vi
是 Linux 繼承自 Unix 的廣泛使用文字編輯器。 不論是否接受,Bash 使用者都必須知道vi
的基本概念。選取 i 鍵,將
vi
置於插入模式。 然後鍵入下列 Python 程式:i = 0 while i == 0: pass
這個程式在執行時,會以無限迴圈的方式執行,顯然不是您想在伺服器上執行的方式。
選取 Esc 鍵以結束插入模式。 然後鍵入下列命令,後面接著 Enter 鍵以儲存程式並結束
vi
::wq
請務必在命令的開頭包含冒號。 至於命令的其餘部分,
w
代表「寫入 (write)」,而q
代表「結束 (quit)」。現在使用下列命令來啟動程式,並使其在背景執行:
python3 bad.py &
請務必在命令的結尾包含連字號 (
&
。 否則,您不會返回 Bash 提示字元。 在 Bash 中,連字號會執行命令並返回命令列 (即使命令尚未完成執行)。
這並不明顯,但 bad.py 現在正在背景執行,並從其他程序竊取 CPU 週期。 讓我們仔細看看發生什麼事。
終止程序
若要刪除程序,您需要程序名稱或程序識別碼。 這是 ps
的作業。
若要重新整理您的記憶體,
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
從清單看來,bad.py 耗用伺服器 99% 的 CPU 時間。 此程式真的名符其實。
kill
命令會根據其程序識別碼來刪除執行中的程序。 (名為killall
的相關命令會根據程序名稱來終止程序。)當您呼叫kill
時,您必須決定要使用哪種「訊號」來終止程序。 使用下列命令來顯示訊號類型清單:kill -l
如果您要終止精靈程序 (在背景執行並為作業系統提供重要服務的程序),建議您將其終止並立即重新啟動。 若要這麼做,您可以使用
SIGHUP
訊號。在此範例中,您想要終止程序而不需重新啟動。 因此,您想使用與編號 9 對應的
SIGKILL
訊號。 為此目的,請從ps -ef
輸出抓取 bad.py 的程序識別碼 (位於第二欄),然後使用下列命令來終止程序。 將PROCESS_ID
取代為程序識別碼。kill -9 PROCESS_ID
您也可將相同的命令輸入為
kill -s SIGKILL PROCESS_ID
。 您可以自行決定要使用訊號的名稱或編號。最後,再次執行
ps
以確認 bad.py 已不再執行。
ps
和 kill
的另一種常見用法是識別並終止「僵屍程序」,這是撰寫不良的程式所留下的子系程序。