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。查阅命令的本地文档并确认结果。终止信号是请求进程停止;它既不保证立即终止,也不保证保留程序尚未保存的工作。