Linux 进程管理入门
进程管理:做 Linux 系统的交通警察
Linux 通常是一个非常稳定的系统。但偶尔,程序可能会卡死,或者我们希望调整系统资源的分配。这时,我们就需要化身为系统的“交通警察”,对运行中的程序(也就是“进程”)进行管理。本篇教程将带你快速掌握这项核心技能。
什么是进程?
我们可以把“程序”比作一份菜谱,它记录了制作一道菜的所有步骤。而“进程”则是你正在根据这份菜谱做菜的那个行为。当你运行一个程序时,系统会把菜谱(指令)加载到内存里,并为你准备好锅碗瓢盆(变量空间等资源)。这个正在运行、占用着系统资源的实例,就是进程。
系统里正在忙些什么?
Linux 是一个多任务操作系统,意味着许多进程可以同时运行。除了你自己启动的程序,系统本身和其他用户(如果有多用户的话)也会运行各种进程。想知道当前系统有多“热闹”,我们可以使用 top
命令。
top
top
命令会打开一个实时动态的“仪表盘”,让你对系统状态一目了然。下面是一个简化版的输出示例:
top
Tasks: 174 total, 3 running, 171 sleeping, 0 stopped
KiB Mem: 4050604 total, 3114428 used, 936176 free
Kib Swap: 2104476 total, 18132 used, 2086344 free
PID USER %CPU %MEM COMMAND
6978 ryan 3.0 21.2 firefox
11 root 0.3 0.0 rcu_preempt
6601 ryan 2.0 2.4 kwin
...
我们来解读一下关键信息:
- 第 2 行 (Tasks):任务(Tasks)就是进程。这里显示了总进程数、正在运行的、休眠的等等。大部分进程处于“休眠 (sleeping)”状态是完全正常的,它们只是在等待某个事件发生时才被唤醒。
- 第 3 行 (Mem):这是物理内存(RAM)的使用情况。Linux 会把最近用过的东西缓存在内存里以提高速度,所以
used
占用高并不一定是坏事。当新程序需要内存时,系统会自动清理缓存。 - 第 4 行 (Swap):这是交换分区(虚拟内存)的使用情况。如果这里的使用率持续很高,可能意味着你的物理内存不太够用。
- 进程列表:下面是按资源占用率(默认是 CPU)排序的进程列表,它会实时刷新。
- PID: 进程 ID (Process ID),每个进程独一无二的身份证号。
- USER: 运行该进程的用户。
- %CPU: 进程占用的 CPU 百分比。
- %MEM: 进程占用的物理内存百分比。
- COMMAND: 进程的命令名。
如果只想看一眼系统当前的进程“快照”而不是实时监控,可以使用 ps
(processes) 命令。单独使用 ps
只会显示当前终端的进程,没什么用。我们通常使用 ps aux
来查看系统上所有的进程。
ps aux
因为 ps aux
的输出非常多,我们常常会结合 grep
命令来筛选出我们关心的特定进程。
如何终止“失控”的进程?
程序偶尔会崩溃或无响应,比如浏览器突然卡住,无法关闭。别担心,我们可以手动“终结”它。
假设 Firefox 浏览器卡死了,我们需要两步来解决它:
第一步:找到它的 PID
我们用 ps aux
配合 grep
来查找 Firefox 进程的身份证号(PID)。
ps aux | grep 'firefox'
输出可能像这样:
ryan 6978 8.8 23.5 2344096 945452 ? Sl 08:03 49:53 /usr/lib64/firefox/firefox
ryan
后面的那个数字 6978
就是 Firefox 进程的 PID。
第二步:执行“击杀”命令
我们使用 kill
命令,并带上我们找到的 PID。
kill <PID>
我们先尝试“礼貌地”通知它退出:
kill 6978
这个命令会发送一个默认的“请退出”信号。这是首选方式,因为它给了程序一个机会去完成清理工作再关闭。但有时,顽固的进程会忽略这个请求。我们可以再次用 ps aux | grep 'firefox'
检查它是否还在。如果还在,我们就需要动用“王炸”了。
kill -9 6978
-9
信号是一种强制终结令,它会像一把大锤,不由分说地将进程彻底清除。普通用户只能 kill
自己的进程,而 root
用户可以 kill
系统上任何一个进程。
实战技巧:桌面卡死了怎么办?
极少数情况下,一个崩溃的程序可能会导致整个图形桌面都失去响应。此时,还有一个“秘密通道”可以救你。
Linux 默认运行着多个虚拟控制台。我们平时看到的图形界面通常在第 7 个控制台。当图形界面卡死时,我们可以尝试切换到其他纯文本的控制台来解决问题。
- 按下
Ctrl + Alt + F2
(或者 F3, F4, F5, F6)
如果成功,你会进入一个黑底白字的登录界面。登录后,你就可以像上面那样使用 ps
和 kill
命令来查找并终止那些高 CPU 或高内存占用的可疑进程了。解决问题后,按下 Ctrl + Alt + F7
(或者 F1,取决于你的发行版) 就可以尝试切回图形界面。
前台任务与后台任务
我们平时在终端里运行命令,命令执行时会占据终端,直到它完成我们才能输入新命令,这叫前台任务。但有些任务需要很长时间(比如编译代码、处理大文件),我们不希望一直干等着。这时就可以让它在后台运行。
我们用 sleep
命令来演示,它只会等待指定的秒数。
sleep 5
你会发现终端被“卡住”了 5 秒,然后才返回提示符。现在,我们在命令末尾加上一个 &
符号,把它送到后台去:
sleep 5 &
[1] 21634
终端立即返回了提示符,并告诉你它创建了一个后台工作(Job),编号为 [1]
,进程ID为 21634
。你可以继续做别的事情。大约 5 秒后,你按一下回车,终端会提示你 [1]+ Done sleep 5
,表示后台任务已完成。
我们可以使用 jobs
命令查看当前有哪些后台任务。
我们还可以在前后台之间切换任务:
- 运行一个耗时任务,比如
sleep 30
。 - 在它运行时,按下
Ctrl + z
。 - 这个任务会被暂停 (Stopped) 并被放入后台。
- 使用
jobs
命令可以看到这个已暂停的任务。 - 使用
fg <job_number>
(fg 是 foreground 的缩写) 可以把它重新带回前台继续运行。例如fg 1
。
注意! 很多从 Windows 过来的人习惯用
Ctrl + z
来撤销,但在 Linux 终端里,它会把你的程序(比如vi
编辑器)暂停并扔到后台。如果你发现程序“消失”了,别慌,用jobs
看看,再用fg
把它找回来就行。
核心命令总结
top
: 实时动态地查看系统进程和资源占用情况。ps
: 给系统进程拍一张“快照”。常用组合是ps aux
。kill
: 终止一个进程。先礼貌地尝试kill <PID>
,不行再用kill -9 <PID>
。jobs
: 显示当前终端的后台任务列表。&
(加在命令末尾)
: 让命令在后台运行。Ctrl + z
: 暂停当前前台任务,并将其移至后台。fg
: 将一个后台任务重新调回前台运行。
动手实践
现在轮到你了,打开终端试试吧:
- 启动几个图形界面的程序(比如计算器、文本编辑器)。
- 使用
ps aux | grep <程序名>
找到它们的 PID,然后用kill
命令把它们关掉。 - 尝试切换到
Ctrl + Alt + F2
虚拟控制台,在那里重复上面的操作。 - 玩转
sleep
命令,练习使用&
、jobs
、Ctrl + z
和fg
,感受前后台任务切换的乐趣。