【菜鸟不菜系列】Linux 基础教程:第七章:进程与作业管理

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 nicerenice 命令

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 提供了两种常用的工具:nicecpulimit

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 管理服务,以及如何使用一些高级工具(如 stracecpulimit)来调试和限制进程的行为。掌握这些命令和技巧将帮助你更高效地管理系统进程,并且能在生产环境中更好地控制系统性能。