练习 - 终止行为异常的进程
计算机并不完美。 迟早会出现错误。 这就是系统管理员存在的意义。系统管理员负责诊断和解决系统问题。
假设 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 周期。 让我们仔细看看发生的情况。
终止进程
若要终止进程,需要进程名称或进程 ID。 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
命令根据进程 ID 终止了正在运行的进程。 (名为killall
的相关命令会根据进程名称终止进程。)调用kill
时,必须确定要用于终止进程的“信号”。 使用以下命令显示信号类型的列表:kill -l
如果要终止后台运行且为操作系统提供关键服务的守护程序进程,可能需要将其终止后立即将其重启。 为此,可以使用
SIGHUP
信号。在此示例中,需要终止该进程且不再将其重启。 因此,建议使用与编号 9 相对应的
SIGKILL
信号。 为此,请从ps -ef
输出(位于第二列)获取 bad.py 的进程 ID,然后使用以下命令来终止进程。 将PROCESS_ID
替换为进程 ID。kill -9 PROCESS_ID
也可以输入
kill -s SIGKILL PROCESS_ID
命令。 由你决定使用信号的名称还是编号。再次运行
ps
以确认 bad.py 不再运行,即完成操作。
ps
和 kill
的另一种常见用途是确定和终止“僵尸进程”,即编写不当的程序所留下的子进程。