介绍
在本实验中,你将学习如何使用 kill
、killall
和 pkill
命令在 Linux 中终止进程。这些命令对于管理正在运行的进程至关重要,可用于停止无响应的应用程序或释放系统资源。
通过本实验,你将能够:
- 使用
kill
命令终止特定进程 - 使用
killall
命令按名称终止多个进程 - 使用
pkill
命令作为killall
的替代方案
在本实验中,你将学习如何使用 kill
、killall
和 pkill
命令在 Linux 中终止进程。这些命令对于管理正在运行的进程至关重要,可用于停止无响应的应用程序或释放系统资源。
通过本实验,你将能够:
kill
命令终止特定进程killall
命令按名称终止多个进程pkill
命令作为 killall
的替代方案在开始终止进程之前,理解两个关键概念非常重要:进程 ID(PID)和信号。
在你的 Ubuntu 虚拟机中打开一个终端。默认情况下,你应该位于 /home/labex/project
目录中。如果不确定,可以通过输入 pwd
并按 Enter 键来检查当前目录。
让我们首先运行一个简单的后台进程。输入以下命令:
sleep 1000 &
该命令启动一个将休眠 1000 秒的进程,并在后台运行它。末尾的 &
告诉 shell 在后台运行该命令,允许你继续使用终端。
要查看正在运行的进程,请使用 ps
命令:
ps aux | grep sleep
该命令显示所有正在运行的进程(ps aux
),然后过滤输出以仅显示包含 "sleep" 的行(grep sleep
)。
你应该会看到类似以下的输出:
第二列中的数字是进程 ID(PID)。稍后我们将使用它来终止进程。
Linux 使用信号与进程通信。用于终止进程的最常见信号是:
kill
命令发送的默认信号。现在我们已经理解了 PID 和信号,接下来可以继续学习如何使用 kill
命令。
kill
命令用于向特定进程发送信号,该进程由其 PID 标识。默认情况下,它会发送 SIGTERM 信号,要求进程优雅地终止。
让我们终止之前启动的 sleep
进程。首先,使用 ps
命令查找其 PID:
ps aux | grep sleep
记下 sleep
进程的 PID。它将是输出中第二列的数字。
现在,使用 kill
命令终止该进程:
kill <PID>
将 <PID>
替换为你记下的实际进程 ID。例如,如果 PID 是 1234,你需要输入 kill 1234
。
检查进程是否仍在运行:
ps aux | grep sleep
你应该不会再在输出中看到 sleep
进程,除了 grep
命令本身。
如果进程仍在运行(对于简单的 sleep
命令来说不太可能,但对于更复杂的应用程序是可能的),你可以使用更强的信号:
kill -9 <PID>
这会发送 SIGKILL 信号,强制终止进程。请谨慎使用 SIGKILL,因为它不允许进程进行清理,这可能会导致数据丢失或其他问题,尤其是在更复杂的应用程序中。
killall
命令允许你通过进程名称终止进程,这比使用 PID 更方便,尤其是在运行多个相同程序的实例时。
启动多个 sleep
进程:
sleep 2000 &
sleep 2000 &
sleep 2000 &
该命令启动三个独立的 sleep
进程,每个进程在后台运行 2000 秒。
验证进程是否正在运行:
ps aux | grep sleep
你应该会看到列出的三个 sleep
进程。
现在,使用 killall
命令终止所有 sleep
进程:
sudo killall sleep
我们在这里使用 sudo
,因为 killall
可能需要提升权限才能终止由其他用户或系统进程启动的进程。系统可能会提示你输入密码。
验证进程是否已被终止:
ps aux | grep sleep
你应该不会再在输出中看到任何 sleep
进程,除了 grep
命令本身。
如果收到“Operation not permitted”(操作不允许)错误,这意味着你没有终止某些进程的必要权限。在这种情况下,使用上述的 sudo
应该可以解决问题。
pkill
命令是另一种通过进程名称终止进程的方式,类似于 killall
。当你希望基于部分名称匹配终止进程时,它特别有用。
启动更多的 sleep
进程:
sleep 3000 &
sleep 3000 &
sleep 3000 &
这会启动另外三个 sleep
进程,每个进程在后台运行 3000 秒。
使用 pkill
命令终止这些进程:
sudo pkill sleep
与 killall
类似,我们使用 sudo
以确保拥有终止所有匹配进程的必要权限。
验证进程是否已被终止:
ps aux | grep sleep
你应该不会再在输出中看到任何 sleep
进程,除了 grep
命令本身。
pkill
和 killall
的主要区别在于,pkill
可以基于部分进程名称进行匹配。例如,pkill fire
会终止 firefox
和 firebird
进程。这既强大又危险,因此在运行 pkill
命令之前,请务必仔细检查。
现在你已经学会了如何使用 kill
、killall
和 pkill
,让我们通过一个真实应用程序进行练习。我们将以 Firefox 为例,你必须在桌面环境中完成此步骤。
启动 Firefox 浏览器:
firefox &
该命令在后台启动 Firefox。你应该会在桌面上看到 Firefox 窗口打开。
使用 ps
命令查找 Firefox 的 PID:
ps aux | grep firefox
记下 Firefox 主进程的 PID。它通常是列出的第一个 Firefox 进程。
使用 kill
命令终止 Firefox:
kill <PID>
将 <PID>
替换为你记下的 Firefox 的实际进程 ID。
如果 Firefox 没有关闭(这是可能的,因为某些应用程序会捕获 SIGTERM 信号),请尝试使用 SIGKILL 信号:
kill -9 <PID>
请记住,SIGKILL 应作为最后手段使用,因为它不允许应用程序保存状态或正确清理。
或者,你可以使用 killall
或 pkill
:
sudo killall firefox
或
sudo pkill firefox
这些命令将一次性终止所有 Firefox 进程,这比逐个终止进程更方便。
请记住,强制终止应用程序可能会导致数据丢失,因此在可能的情况下,最好正常关闭应用程序。这些命令应在应用程序无响应或需要快速释放系统资源时使用。
恭喜!你已成功完成本实验,学习了如何在 Linux 中终止进程。你已经掌握了以下内容:
kill
命令通过 PID 终止特定进程killall
命令通过名称终止多个进程pkill
命令作为 killall
的替代方案请记住,虽然这些命令是管理进程的强大工具,但请谨慎使用。终止关键系统进程可能会导致系统不稳定。在使用这些命令之前,请务必确认要终止的进程。
随着你在 Linux 学习之旅中的深入,你会发现这些进程管理技能对于维护系统平稳运行和排查问题非常宝贵。继续练习这些命令,以便更加熟练地管理 Linux 中的进程!