练习 - 终止行为异常的进程

已完成

计算机并不完美。 迟早会出现错误。 这就是系统管理员存在的意义。系统管理员负责诊断和解决系统问题。

假设 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 周期。 让我们仔细看看发生的情况。

终止进程

若要终止进程,需要进程名称或进程 ID。 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 命令根据进程 ID 终止了正在运行的进程。 (名为 killall 的相关命令会根据进程名称终止进程。)调用 kill 时,必须确定要用于终止进程的“信号”。 使用以下命令显示信号类型的列表:

    kill -l
    
  3. 如果要终止后台运行且为操作系统提供关键服务的守护程序进程,可能需要将其终止后立即将其重启。 为此,可以使用 SIGHUP 信号。

    在此示例中,需要终止该进程且不再将其重启。 因此,建议使用与编号 9 相对应的 SIGKILL 信号。 为此,请从 ps -ef 输出(位于第二列)获取 bad.py 的进程 ID,然后使用以下命令来终止进程。 将 PROCESS_ID 替换为进程 ID。

    kill -9 PROCESS_ID
    

    也可以输入 kill -s SIGKILL PROCESS_ID 命令。 由你决定使用信号的名称还是编号。

  4. 再次运行 ps 以确认 bad.py 不再运行,即完成操作

pskill 的另一种常见用途是确定和终止“僵尸进程”,即编写不当的程序所留下的子进程。