Linux 基础教程:从零到进阶,成为最强管理员
由 linux.mba「Most Badass Admin」最强管理员社区撰写
第二部分:Linux 进阶
第七章:进程与作业管理
在 Linux 系统中,进程是系统中正在运行的程序。每当你打开一个应用程序,系统就会为它创建一个进程。作为管理员,你需要管理这些进程,确保它们运行正常,同时可以根据需要终止不需要的进程。在本章中,我们将学习如何查看、管理进程,以及如何控制作业。
7.1 查看与管理进程
7.1.1 ps
命令
ps
命令是我们查看系统当前进程的基础工具。它能帮助你了解哪些程序正在运行。
- 查看当前用户的进程:默认情况下,
ps
只显示当前终端会话中的进程。例如,输入以下命令:
ps
假设你看到如下输出:
PID TTY TIME CMD
1234 pts/0 00:00:00 bash
5678 pts/0 00:00:01 top
这里:
PID
是进程的 ID,标识每个运行中的进程。TTY
是该进程所在的终端。TIME
是该进程运行的时间。CMD
是进程执行的命令(程序名称)。- 查看所有进程:如果你想查看所有系统中的进程(不仅是当前用户的),可以使用
ps aux
命令:
ps aux
输出会更长,显示所有进程的信息:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1234 0.1 1.0 9876 1234 tty1 Ss+ 10:30 0:02 /usr/lib/systemd
user 5678 0.3 2.5 11234 2345 pts/0 S+ 10:35 0:03 /bin/bash
7.1.2 top
命令
top
是一个非常强大的命令,可以实时显示系统的进程和资源使用情况。当你需要知道哪个进程正在占用大量 CPU 或内存时,top
是非常有用的工具。
- 运行
top
:直接输入top
并回车:
top
输出类似于下面:
top - 10:30:25 up 1 day, 3:25, 3 users, load average: 0.12, 0.08, 0.06
Tasks: 172 total, 1 running, 171 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.2 us, 1.5 sy, 0.0 ni, 95.0 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 8012.9 total, 3125.5 free, 2368.2 used, 2519.1 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 4976.7 avail Mem
你可以看到:
- 系统总共运行了 172 个任务,其中 1 个正在运行。
- 当前 CPU 占用情况:3.2% 用于用户进程,1.5% 用于系统进程。
- 你的内存(RAM)总共 8GB,其中大约 3GB 是空闲的,2.3GB 正在被使用。按
q
键可以退出top
。 - 常用的快捷键:在
top
界面中,你可以使用以下快捷键:- 按
P
:按 CPU 占用率排序。 - 按
M
:按内存占用排序。 - 按
q
:退出top
。
- 按
7.1.3 kill
命令
kill
命令用来终止进程。当某个进程不响应时,你可以使用 kill
来结束它。
- 终止进程:假设你知道某个进程的 PID(进程 ID),比如
1234
,你可以使用以下命令终止该进程:
kill 1234
如果进程能够正常结束,它将退出。如果进程没有响应,你可以使用 kill -9
强制终止它:
kill -9 1234
强制终止进程可能会导致进程没有机会保存数据,所以请小心使用。
7.1.4 nice
和 renice
命令
nice
命令用来控制进程的优先级。优先级越高的进程越能占用更多的 CPU 资源,而优先级低的进程则会在 CPU 使用空闲时得到执行。
- 使用
nice
启动进程:当你启动一个进程时,可以使用nice
来设置它的优先级。例如,nice -n 10
会给进程一个较低的优先级:
nice -n 10 command
这里的 command
是你要运行的命令,-n 10
表示设置优先级为 10。
- 使用
renice
修改进程优先级:如果你想改变正在运行的进程的优先级,可以使用renice
命令。例如,以下命令会将 PID 为1234
的进程的优先级设置为 10:
renice -n 10 -p 1234
7.2 作业控制
Linux 允许我们在同一个终端中同时运行多个进程(作业)。你可以将一些作业放到后台运行,而将其他作业保留在前台。
7.2.1 bg
命令
bg
命令用来将一个暂停的进程移到后台继续运行。例如,当你按 Ctrl+Z
停止一个进程后,输入以下命令可以将其放到后台:
bg %1
假设 1
是你暂停的作业编号,这将把它移到后台继续运行。
7.2.2 fg
命令
fg
命令将后台作业移到前台运行。例如,假设你有一个后台进程,作业编号是 1
,可以使用:
fg %1
这将把作业编号为 1
的进程带到前台。
7.2.3 jobs
命令
jobs
命令用来列出当前终端中的所有作业。你可以查看它们的状态(例如正在运行或已暂停)。
jobs
假设输出如下:
[1]+ 1234 Stopped ping google.com
[2]- 5678 Running top
这表示有两个作业:
- 作业
1
被暂停,正在执行ping google.com
命令。 - 作业
2
正在后台运行top
。
7.3 使用 systemd
管理服务
systemd
是现代 Linux 系统用于管理进程和服务的工具,它取代了老旧的 init
系统。你可以用它来启动、停止、重启服务,并管理它们的状态。
7.3.1 查看服务状态
要查看某个服务的状态,例如 nginx
,你可以使用 systemctl status
:
systemctl status nginx
输出类似于:
● nginx.service - The nginx web server
Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2025-04-27 10:00:00 UTC; 1h 20min ago
Docs: man:nginx(8)
Main PID: 1234 (nginx)
Tasks: 2 (limit: 4915)
Memory: 4.0M
CGroup: /system.slice/nginx.service
├─1234 nginx: master process /usr/sbin/nginx
└─1235 nginx: worker process
这告诉你 nginx
服务是否正在运行、是否已启用(开机自启),以及它的详细信息。
7.3.2 启动和停止服务
- 启动服务:你可以通过
systemctl start
来启动一个服务:
systemctl start nginx
这会启动 nginx
服务。
- 停止服务:如果你想停止某个正在运行的服务,可以使用
systemctl stop
:
systemctl stop nginx
7.3.3 设置服务开机启动
如果你希望某个服务在开机时自动启动,可以使用 enable
命令:
systemctl enable nginx
- 如果你不想让某个服务开机启动,可以使用
disable
:
systemctl disable nginx
7.3.4 重启服务
如果你对服务进行了配置修改,可以使用 systemctl restart
来重启服务,让新配置生效:
systemctl restart nginx
7.4 进程优先级与限制
在某些情况下,你可能需要调整某个进程的优先级,或者限制进程的资源使用量。Linux 提供了两种常用的工具:nice
和 cpulimit
。
7.4.1 nice
命令
如前所述,nice
命令允许你设置进程的优先级。更高的优先级(低数字)会让进程获得更多的 CPU 时间。默认情况下,进程优先级为 0
,你可以通过 nice
调整它。
- 启动进程时设置优先级:比如你希望以较低的优先级启动一个进程,可以这样做:
nice -n 10 command
其中,-n 10
表示给该进程设置较低的优先级。
- 提高进程优先级:如果一个进程已经在运行,你可以通过
renice
来改变它的优先级:
renice -n -10 -p 1234
这将提高 PID 为 1234
的进程的优先级。
7.4.2 cpulimit
限制进程 CPU 使用
有时你可能想要限制某个进程使用的 CPU 时间,避免它占用过多的资源。你可以使用 cpulimit
来做到这一点。
- 安装
cpulimit
(如果没有安装):在 Ubuntu 上,可以使用apt
安装cpulimit
:
sudo apt install cpulimit
- 限制进程 CPU 使用:假设你想限制一个进程(PID 为
1234
)的 CPU 使用率为 20%,可以使用如下命令:
sudo cpulimit -p 1234 -l 20
这会让进程 1234
的 CPU 使用率限制为 20%。
7.5 使用 strace
调试进程
在系统管理中,某些进程可能会出现问题,而你可能需要对其进行详细的调试。这时,strace
是一个非常有用的工具。
strace
可以跟踪一个进程的系统调用和信号,帮助你分析程序的行为,特别是当程序出现卡死或崩溃时,它能提供有价值的线索。
- 使用
strace
跟踪进程:假设你有一个进程,PID 为1234
,你可以用strace
来查看它的系统调用:
sudo strace -p 1234
这将会打印出该进程所执行的每一个系统调用。例如:
open("/etc/passwd", O_RDONLY) = 3
read(3, "root:x:0:0:root:/root:/bin/bash\n", 1024) = 44
close(3) = 0
这可以帮助你调试进程中的问题。
- 使用
strace
跟踪命令:你还可以在命令运行时使用strace
,例如:
strace ls -l
这会显示 ls
命令执行过程中的系统调用。
7.6 进程的状态与退出代码
了解进程的状态和它们退出时的返回值对于故障排除非常重要。
7.6.1 进程的状态
进程的状态可以通过 ps
命令查看,它会显示每个进程的当前状态。常见的状态包括:
R
:运行中(Running)S
:睡眠中(Sleeping)T
:停止中(Stopped)Z
:僵尸(Zombie)
例如,在 ps aux
输出中,你可能会看到如下进程状态:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user 12345 0.0 0.0 4844 884 pts/0 S+ 13:25 0:00 top
root 67890 0.1 0.5 32972 2952 pts/1 Z 12:32 0:00 [some_process] <defunct>
在此,进程 12345
处于睡眠状态,而 67890
是一个僵尸进程(Z
表示僵尸进程)。
7.6.2 进程退出代码
每个进程在结束时都会返回一个退出代码(Exit Code),它指示进程是成功退出还是遇到错误。退出代码为 0
通常表示成功,而非 0
的值表示错误。
你可以通过 $?
来查看上一个命令的退出代码:
echo $?
例如,假设你执行了一个命令后查看退出代码:
ls /nonexistent_directory
echo $?
输出将会是:
2
这意味着 ls
命令未能找到指定的目录,因此返回错误代码 2
。
总结
在这一章中,我们详细学习了如何管理和控制 Linux 系统中的进程与作业。你学会了如何查看和管理进程,如何调整进程的优先级,如何使用 systemd
管理服务,以及如何使用一些高级工具(如 strace
和 cpulimit
)来调试和限制进程的行为。掌握这些命令和技巧将帮助你更高效地管理系统进程,并且能在生产环境中更好地控制系统性能。