Linux 进程终止

LinuxLinuxBeginner
立即练习

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

简介

在这个实验中,你将学习 Linux 进程管理的基本技能,重点是如何识别和终止进程。进程管理对于任何 Linux 用户或管理员来说都是一项基本技能,因为它能让你有效地管理系统资源。

你将学习如何使用 ps 命令来识别正在运行的进程,以及如何在必要时使用 kill 命令来终止它们。这些工具对于维护系统性能和处理无响应的应用程序至关重要。

在这个实验结束时,你将能够识别进程、了解它们的属性,并使用各种方法终止它们。这些技能对于故障排除和高效管理 Linux 系统非常有价值。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/ProcessManagementandControlGroup(["Process Management and Control"]) linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux/BasicSystemCommandsGroup -.-> linux/sleep("Execution Delaying") linux/ProcessManagementandControlGroup -.-> linux/kill("Process Terminating") linux/ProcessManagementandControlGroup -.-> linux/killall("Multi-Process Killing") linux/ProcessManagementandControlGroup -.-> linux/bg_process("Background Management") linux/SystemInformationandMonitoringGroup -.-> linux/ps("Process Displaying") subgraph Lab Skills linux/sleep -.-> lab-271315{{"Linux 进程终止"}} linux/kill -.-> lab-271315{{"Linux 进程终止"}} linux/killall -.-> lab-271315{{"Linux 进程终止"}} linux/bg_process -.-> lab-271315{{"Linux 进程终止"}} linux/ps -.-> lab-271315{{"Linux 进程终止"}} end

识别进程

在 Linux 中,每个正在运行的程序或应用程序都被视为一个进程。每个进程都有一个唯一的标识符,称为进程 ID(PID)。在终止进程之前,你需要使用其 PID 来识别它。

让我们先学习如何使用 ps 命令查看正在运行的进程。该命令会显示系统中活动进程的信息。

首先,在 LabEx 虚拟机环境中打开一个终端,并运行以下命令:

ps

你将看到当前终端会话中正在运行的进程的基本列表。输出应该类似于以下内容:

  PID TTY          TIME CMD
 2104 pts/0    00:00:00 zsh
 2116 pts/0    00:00:00 ps

此输出显示:

  • PID:进程 ID 号
  • TTY:进程运行所在的终端类型
  • TIME:进程使用的 CPU 时间量
  • CMD:启动该进程的命令

要查看系统上运行的所有进程的更全面列表,请使用带有附加选项的以下命令:

ps -aux

这些选项的含义如下:

  • -a:显示所有用户的进程
  • -u:以详细的面向用户的格式显示
  • -x:包括没有控制终端的进程

输出会更长、更详细,显示系统上运行的所有进程:

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.1 167936 11876 ?        Ss   10:30   0:01 /sbin/init
root           2  0.0  0.0      0     0 ?        S    10:30   0:00 [kthreadd]
...
labex       2104  0.0  0.1  11108  5456 pts/0    Ss   10:35   0:00 zsh
labex       2130  0.0  0.0   9828  3384 pts/0    R+   10:36   0:00 ps -aux

现在,让我们创建一个简单的后台进程,以便进行练习:

sleep 300 &
sleep_pid=$!

此命令启动一个进程,该进程将“休眠”(不执行任何操作)300 秒(5 分钟)。& 符号将其放在后台运行,$! 捕获最近启动的后台进程的 PID。

让我们验证该进程是否正在运行:

echo "The sleep process ID is: $sleep_pid"
ps | grep sleep

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

The sleep process ID is: 2135
 2135 pts/0    00:00:00 sleep

现在你知道如何识别进程并找到它们的 PID 了。在下一步中,我们将学习如何终止这个进程。

使用 kill 命令终止进程

现在你已经识别出了一个进程及其 PID,接下来可以学习如何使用 kill 命令来终止它。kill 命令会向进程发送一个信号,指示其终止。

kill 命令的基本语法如下:

kill [options] <PID>

让我们来终止上一步中创建的 sleep 进程。我们已将其 PID 存储在 $sleep_pid 变量中。使用以下命令来终止它:

kill $sleep_pid

如果你忘记了该进程的 PID,可以使用以下命令再次查找:

ps | grep sleep

执行 kill 命令后,验证该进程是否已被终止:

ps | grep sleep

如果进程已成功终止,你应该看不到输出,或者输出中仅显示 grep 进程本身。这意味着 sleep 进程已不再运行。

如果你想更彻底地确认,可以再次使用 ps 命令列出所有进程:

ps -aux | grep sleep

输出可能如下所示:

labex       2156  0.0  0.0   7236   720 pts/0    S+   10:40   0:00 grep --color=auto sleep

显示的唯一进程是 grep 命令本身,这表明 sleep 进程已被终止。

默认情况下,kill 命令会向进程发送一个 TERM(终止)信号,这允许进程在执行任何清理操作后正常退出。在大多数情况下,这足以终止一个进程。

现在你已经成功地使用 kill 命令识别并终止了一个进程,这是在 Linux 中管理进程的一项基本技能。

理解 kill 信号

在 Linux 中,kill 命令可以向进程发送多种类型的信号,而不仅仅是终止信号。了解这些信号能让你更好地控制进程的终止方式。

首先,通过运行以下命令查看所有可用的信号:

kill -l

这将列出 kill 命令可以发送的所有信号。输出如下:

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
...

最常用的信号有:

  • SIGTERM (15):kill 命令默认发送的信号。请求进程正常终止。
  • SIGKILL (9):强制进程立即终止。当进程对 SIGTERM 信号无响应时使用。
  • SIGHUP (1):传统上用于重置或重新加载配置文件。
  • SIGINT (2):当你在终端中按下 Ctrl+C 时发送。

让我们再创建一个 sleep 进程来进行练习:

sleep 300 &
sleep_pid=$!
echo "The new sleep process ID is: $sleep_pid"

现在,使用信号编号向进程发送特定的信号:

kill -15 $sleep_pid

这等同于默认的 kill 命令,因为它发送的是 SIGTERM 信号(信号编号 15)。

验证该进程是否已被终止:

ps | grep sleep

让我们再创建一个 sleep 进程来演示 SIGKILL 信号:

sleep 300 &
sleep_pid=$!
echo "The third sleep process ID is: $sleep_pid"

现在,使用 SIGKILL 信号强制终止该进程:

kill -9 $sleep_pid

验证该进程是否已被终止:

ps | grep sleep

SIGKILL 信号(9)是一种“最后手段”选项,原因如下:

  1. 它不允许进程自行清理。
  2. 它可能会使资源处于不一致的状态。
  3. 如果进程正在写入数据,它可能会导致数据丢失。

始终先尝试使用 SIGTERM 信号,只有当进程对 SIGTERM 信号无响应时,才使用 SIGKILL 信号。

高级进程管理

除了基本的 pskill 命令外,Linux 还提供了其他用于管理进程的命令。这些工具在识别和终止进程方面提供了更多的灵活性和便利性。

pgrep 命令

pgrep 命令允许你通过进程名来查找进程,而无需手动查看 ps 命令的输出:

pgrep sleep

该命令将查找所有名称中包含 "sleep" 的进程,并输出它们的 PID。

pkill 命令

pkill 命令结合了 pgrepkill 的功能——它通过进程名查找进程并向它们发送信号:

## Start two sleep processes
sleep 300 &
sleep 300 &

## Kill all sleep processes
pkill sleep

验证所有 sleep 进程是否已被终止:

ps | grep sleep

killall 命令

pkill 类似,killall 命令通过进程名终止进程:

## Start two more sleep processes
sleep 300 &
sleep 300 &

## Kill all sleep processes
killall sleep

再次验证:

ps | grep sleep

使用 nicerenice 调整进程优先级

Linux 还允许你使用 nicerenice 命令来控制进程的优先级。

让我们以较低的优先级启动一个进程:

nice -n 10 sleep 300 &

nice 值的范围从 -20(最高优先级)到 19(最低优先级),默认值为 0。只有 root 用户可以设置负的 nice 值。

你可以使用 renice 更改正在运行的进程的优先级:

sleep_pid=$!
echo "Sleep process ID with lower priority: $sleep_pid"
renice -n 15 -p $sleep_pid

让我们检查新的优先级:

ps -o pid,nice,cmd -p $sleep_pid

最后,终止这个进程:

kill $sleep_pid

这些高级进程管理命令为管理多个进程和控制系统资源提供了更高效的方法,这在繁忙的系统上或排查性能问题时特别有用。

总结

在本次实验中,你学习了对系统管理和故障排除非常有价值的 Linux 进程管理核心技能:

  1. 识别进程:你学习了如何使用 ps 命令列出正在运行的进程并查找它们的进程 ID(PID)。
  2. 终止进程:你练习了使用 kill 命令通过进程的 PID 向其发送终止信号。
  3. 理解 kill 信号:你探索了可以发送给进程的不同类型的信号,包括用于正常终止的 SIGTERM(15)和用于强制终止的 SIGKILL(9)。
  4. 高级进程管理:你了解了更强大的工具,如 pgreppkillkillall,它们可以通过进程名查找和终止进程,以及如何使用 nicerenice 控制进程优先级。

这些技能使你能够:

  • 有效地监控系统进程
  • 终止无响应的应用程序
  • 管理系统资源
  • 排查性能问题

进程管理是 Linux 系统管理的一个基本方面,你在本次实验中学到的命令被 Linux 管理员和用户日常使用,以维护系统的性能和稳定性。