HOWTO · Python

如何終止 Python 程序

瞭解如何使用 Ctrl+C、經核實的處理序 ID 或依名稱比對的命令停止 Python 程序。

本頁內容

要停止一個 Python 程序,先在其執行的終端機或 IDE 中按 CTRL+C。如果這沒有停止前景程序,就找出它的處理序 ID,並對一個經核實的程序使用 kill。只有當你打算針對每一個符合的程序時,才使用 killall 或 pkill;它們是否可用以及比對規則取決於作業系統。

使用鍵盤快捷鍵終止 Python 程序

點擊執行該程序的終端機或 IDE,按 CTRL+C。這會向前景程序送出一個中斷。Python 通常會透過引發 KeyboardInterrupt 並停止來回應,但程序可能處理該中斷,或者正處於不能及時回應的程式碼中。如果程序可能正在寫入檔案或更新資料,請先儲存工作。

如果程序仍在繼續,使用終端機找出它的程序,並從下面選擇一種命令列方法。程序也可以處理或延後終止訊號;強制終止是另一層級的升級手段,可能遺失未儲存的資料。

使用程序名稱和 kill 命令終止 Python 程序

kill 命令針對的是處理序 ID(PID),而不是程序名稱。在 Linux 上,用 ps -eo pid,comm,args 檢查程序清單,找到其命令和引數能標識出你想停止的那個 Python 程序的列。不要從舊截圖中抄錄 PID,也不要假設每一列只要包含 “python” 就是正確目標。PID 可能被重用,因此在送出訊號之前要立即核實候選程序。

在 Bash 中,這個小檢查把目前的 shell 作為一個已知程序,並確認它的 PID 可達:

pid=$$
if kill -0 "$pid" 2>/dev/null; then
    printf 'The selected PID is available.\n'
else
    printf 'The selected PID is unavailable.\n'
fi
The selected PID is available.

該檢查已成功執行,並印出了上面顯示的可用性訊息。kill -0 檢查程序是否存在以及你是否可以向它送出訊號;它並不核實該程序是否屬於 Python。把 shell 的 PID 替換為你找出的候選程序,並在行動之前再次檢查程序清單。

在類 Unix 系統上,kill PID 預設送出 SIGTERM,它請求程序終止並給它清理的機會。例如,把 PID 替換為核實過的數字後,使用 kill -TERM PID。再次檢查程序清單,看它是否已停止。如果它仍在,先弄清原因再考慮更強的訊號;不要把 kill -9 當作例行的第一步。

使用程序名稱和 killall 命令終止 Python 程序

killall 依名稱選擇程序,因此像 python 這樣寬泛的名稱可能符合到不止你想停止的那一個腳本。用你系統上可用的程序清單工具審查符合結果,並盡可能縮小名稱範圍。只有當你打算停止該本機命令符合到的所有程序時,才執行 killall python。

該命令並非到處可用,且各類 Unix 系統上的實作各不相同。在依賴它的名稱比對或訊號選項之前,先查閱本機的 killall 手冊頁。在某些系統上,它的行為與 Linux 上常用於終止程序的命令不同。

使用程序名稱和 pkill 命令終止 Python 程序

pkill 也依名稱選擇程序,並且可能向多個符合項送出訊號。它的模式和選項因實作而異。先檢查候選程序;在支援的系統上,pgrep -a python 可以顯示符合的 PID 和命令列。如果清單中包含不相關的程序,就選擇更具體的模式或其他受支援的選擇器。

當符合項正是你打算停止的程序時,在支援 -f 的實作上,pkill -TERM -f 'your-specific-script.py' 會向完整命令列與該模式符合的程序送出 SIGTERM。把該模式當作選擇器,而不是單一符合的保證,並在目標系統上查閱 man pkill。當你需要針對一個經核實的程序時,使用帶 PID 的 kill。

結論

對附著在你終端機上的 Python 程序使用 Ctrl+C;對一個特定程序使用帶新近核實的處理序 ID 的 kill;只有當所有選取的名稱符合項都是預期目標時,才使用 killall 或 pkill。查閱命令的本機文件並確認結果。終止訊號是請求程序停止;它既不保證立即終止,也不保證保留程序尚未儲存的工作。