在 Linux 中终止进程

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,你将学习如何使用 killkillallpkill 命令在 Linux 中终止进程。这些命令对于管理正在运行的进程至关重要,可用于停止无响应的应用程序或释放系统资源。

通过本实验,你将能够:

  • 使用 kill 命令终止特定进程
  • 使用 killall 命令按名称终止多个进程
  • 使用 pkill 命令作为 killall 的替代方案

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/TextProcessingGroup(["Text Processing"]) linux(("Linux")) -.-> linux/ProcessManagementandControlGroup(["Process Management and Control"]) linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux(("Linux")) -.-> linux/UserandGroupManagementGroup(["User and Group Management"]) linux/BasicSystemCommandsGroup -.-> linux/sleep("Execution Delaying") linux/TextProcessingGroup -.-> linux/grep("Pattern Searching") linux/ProcessManagementandControlGroup -.-> linux/kill("Process Terminating") linux/ProcessManagementandControlGroup -.-> linux/killall("Multi-Process Killing") linux/ProcessManagementandControlGroup -.-> linux/pkill("Pattern-Based Killing") linux/SystemInformationandMonitoringGroup -.-> linux/ps("Process Displaying") linux/UserandGroupManagementGroup -.-> linux/sudo("Privilege Granting") subgraph Lab Skills linux/sleep -.-> lab-44{{"在 Linux 中终止进程"}} linux/grep -.-> lab-44{{"在 Linux 中终止进程"}} linux/kill -.-> lab-44{{"在 Linux 中终止进程"}} linux/killall -.-> lab-44{{"在 Linux 中终止进程"}} linux/pkill -.-> lab-44{{"在 Linux 中终止进程"}} linux/ps -.-> lab-44{{"在 Linux 中终止进程"}} linux/sudo -.-> lab-44{{"在 Linux 中终止进程"}} end

理解进程 ID 和信号

在开始终止进程之前,理解两个关键概念非常重要:进程 ID(PID)和信号。

  1. 在你的 Ubuntu 虚拟机中打开一个终端。默认情况下,你应该位于 /home/labex/project 目录中。如果不确定,可以通过输入 pwd 并按 Enter 键来检查当前目录。

  2. 让我们首先运行一个简单的后台进程。输入以下命令:

    sleep 1000 &

    该命令启动一个将休眠 1000 秒的进程,并在后台运行它。末尾的 & 告诉 shell 在后台运行该命令,允许你继续使用终端。

  3. 要查看正在运行的进程,请使用 ps 命令:

    ps aux | grep sleep

    该命令显示所有正在运行的进程(ps aux),然后过滤输出以仅显示包含 "sleep" 的行(grep sleep)。

    你应该会看到类似以下的输出:

    显示 sleep 进程的终端

    第二列中的数字是进程 ID(PID)。稍后我们将使用它来终止进程。

  4. Linux 使用信号与进程通信。用于终止进程的最常见信号是:

    • SIGTERM (15):优雅地终止进程。这是 kill 命令发送的默认信号。
    • SIGKILL (9):强制终止进程。当 SIGTERM 不起作用时,应将其作为最后手段使用。

现在我们已经理解了 PID 和信号,接下来可以继续学习如何使用 kill 命令。

使用 kill 命令

kill 命令用于向特定进程发送信号,该进程由其 PID 标识。默认情况下,它会发送 SIGTERM 信号,要求进程优雅地终止。

  1. 让我们终止之前启动的 sleep 进程。首先,使用 ps 命令查找其 PID:

    ps aux | grep sleep

    记下 sleep 进程的 PID。它将是输出中第二列的数字。

  2. 现在,使用 kill 命令终止该进程:

    kill <PID>

    <PID> 替换为你记下的实际进程 ID。例如,如果 PID 是 1234,你需要输入 kill 1234

  3. 检查进程是否仍在运行:

    ps aux | grep sleep

    你应该不会再在输出中看到 sleep 进程,除了 grep 命令本身。

如果进程仍在运行(对于简单的 sleep 命令来说不太可能,但对于更复杂的应用程序是可能的),你可以使用更强的信号:

kill -9 <PID>
使用 kill 命令终止进程

这会发送 SIGKILL 信号,强制终止进程。请谨慎使用 SIGKILL,因为它不允许进程进行清理,这可能会导致数据丢失或其他问题,尤其是在更复杂的应用程序中。

使用 killall 命令

killall 命令允许你通过进程名称终止进程,这比使用 PID 更方便,尤其是在运行多个相同程序的实例时。

  1. 启动多个 sleep 进程:

    sleep 2000 &
    sleep 2000 &
    sleep 2000 &

    该命令启动三个独立的 sleep 进程,每个进程在后台运行 2000 秒。

  2. 验证进程是否正在运行:

    ps aux | grep sleep

    你应该会看到列出的三个 sleep 进程。

  3. 现在,使用 killall 命令终止所有 sleep 进程:

    sudo killall sleep

    我们在这里使用 sudo,因为 killall 可能需要提升权限才能终止由其他用户或系统进程启动的进程。系统可能会提示你输入密码。

  4. 验证进程是否已被终止:

    ps aux | grep sleep

    你应该不会再在输出中看到任何 sleep 进程,除了 grep 命令本身。

如果收到“Operation not permitted”(操作不允许)错误,这意味着你没有终止某些进程的必要权限。在这种情况下,使用上述的 sudo 应该可以解决问题。

使用 pkill 命令

pkill 命令是另一种通过进程名称终止进程的方式,类似于 killall。当你希望基于部分名称匹配终止进程时,它特别有用。

  1. 启动更多的 sleep 进程:

    sleep 3000 &
    sleep 3000 &
    sleep 3000 &

    这会启动另外三个 sleep 进程,每个进程在后台运行 3000 秒。

  2. 使用 pkill 命令终止这些进程:

    sudo pkill sleep

    killall 类似,我们使用 sudo 以确保拥有终止所有匹配进程的必要权限。

  3. 验证进程是否已被终止:

    ps aux | grep sleep

    你应该不会再在输出中看到任何 sleep 进程,除了 grep 命令本身。

pkillkillall 的主要区别在于,pkill 可以基于部分进程名称进行匹配。例如,pkill fire 会终止 firefoxfirebird 进程。这既强大又危险,因此在运行 pkill 命令之前,请务必仔细检查。

使用真实应用程序进行练习

现在你已经学会了如何使用 killkillallpkill,让我们通过一个真实应用程序进行练习。我们将以 Firefox 为例,你必须在桌面环境中完成此步骤。

Firefox 进程终止示例
  1. 启动 Firefox 浏览器:

    firefox &

    该命令在后台启动 Firefox。你应该会在桌面上看到 Firefox 窗口打开。

  2. 使用 ps 命令查找 Firefox 的 PID:

    ps aux | grep firefox

    记下 Firefox 主进程的 PID。它通常是列出的第一个 Firefox 进程。

  3. 使用 kill 命令终止 Firefox:

    kill <PID>

    <PID> 替换为你记下的 Firefox 的实际进程 ID。

  4. 如果 Firefox 没有关闭(这是可能的,因为某些应用程序会捕获 SIGTERM 信号),请尝试使用 SIGKILL 信号:

    kill -9 <PID>

    请记住,SIGKILL 应作为最后手段使用,因为它不允许应用程序保存状态或正确清理。

  5. 或者,你可以使用 killallpkill

    sudo killall firefox

    sudo pkill firefox

    这些命令将一次性终止所有 Firefox 进程,这比逐个终止进程更方便。

请记住,强制终止应用程序可能会导致数据丢失,因此在可能的情况下,最好正常关闭应用程序。这些命令应在应用程序无响应或需要快速释放系统资源时使用。

总结

恭喜!你已成功完成本实验,学习了如何在 Linux 中终止进程。你已经掌握了以下内容:

  1. 使用 kill 命令通过 PID 终止特定进程
  2. 使用 killall 命令通过名称终止多个进程
  3. 使用 pkill 命令作为 killall 的替代方案
  4. 将这些命令应用于简单的后台进程和真实应用程序

请记住,虽然这些命令是管理进程的强大工具,但请谨慎使用。终止关键系统进程可能会导致系统不稳定。在使用这些命令之前,请务必确认要终止的进程。

随着你在 Linux 学习之旅中的深入,你会发现这些进程管理技能对于维护系统平稳运行和排查问题非常宝贵。继续练习这些命令,以便更加熟练地管理 Linux 中的进程!