Unix/Linux - 进程管理

你好,有抱负的程序设计师们!今天,我们将踏上一段激动人心的旅程,探索Unix/Linux进程的世界。作为你亲切的计算机科学老师,我很高兴引导你了解这个基本概念。如果你是编程新手,不用担心——我们将从基础开始,逐步深入。那么,来一杯咖啡(或者你喜欢的话,来一杯茶),让我们开始吧!

Unix / Linux - Processes

进程是什么?

在我们开始之前,让我们先了解一下进程到底是什么。想象你在一个热闹的厨房里。每个负责特定菜肴的厨师都可以被视为一个进程。他们有自己的原料(资源)、食谱(程序)和目标(输出)。在计算机世界中,进程只是一个正在执行的程序。

启动进程

在Unix/Linux中启动进程就像馅饼一样简单!你可以主要通过两种方式来做:

  1. 前台进程:键入命令后按回车。
  2. 后台进程:在命令末尾加上一个与号(&)。

让我们看一些例子:

# 前台进程
$ ls -l

# 后台进程
$ long_running_command &

在第一个例子中,ls -l 在前台运行,显示目录内容。在第二个例子中,命令在后台运行,允许你继续使用终端。

列出运行中的进程

现在,如果你想要查看在你的系统中工作的所有“厨师”(进程),该怎么做呢?这时,ps 命令就派上用场了!

$ ps aux

这个命令会显示所有运行中的进程。就像窥视你厨房的每个角落!

以下是你将看到的内容的分解:

描述
USER 进程所有者
PID 进程 ID
%CPU CPU 使用率
%MEM 内存使用率
VSZ 虚拟内存大小
RSS 居住集合大小
TTY 终端类型
STAT 进程状态
START 开始时间
TIME CPU 时间
COMMAND 命令名称

终止进程

有时,一个进程可能会失控(就像一个烧毁所有东西的厨师)。在这种情况下,你需要停止它。以下是如何操作的:

$ kill PID

将 PID 替换为你想要终止的进程 ID。如果你想要更加果断,可以使用:

$ kill -9 PID

这就相当于立刻解雇那个厨师——这是一种强制性的终止!

父进程与子进程

在Unix/Linux中,进程有一个家族树。当一个进程创建另一个进程时,它成为父进程,而新的进程是它的子进程。就像一个主厨(父进程)分配任务给副厨师(子进程)。

你可以使用以下命令查看这种关系:

$ pstree

这个命令会显示进程树,说明父进程和子进程之间的关系。

僵尸进程和孤儿进程

现在,让我们谈谈一些特殊类型的进程:

  1. 僵尸进程:一个已经执行完毕但仍在进程表中保留条目的子进程。就像一个完成菜肴但还没有打卡下班的厨师。
  2. 孤儿进程:一个父进程已经完成或终止,但它仍在运行的进程。想象一个主厨已经回家,但副厨师仍在工作。

要查看你是否有任何僵尸进程,可以使用:

$ ps aux | grep Z

守护进程

守护进程就像厨房里24小时工作的员工。它们在后台运行,提供各种服务。例如,sshd 守护进程监听传入的SSH连接。

要列出所有守护进程,可以使用:

$ ps -eo 'tty,pid,comm' | grep ^?

top 命令

top 命令是您的全方位厨房监控器。它提供了一个动态的实时视图,显示正在运行的系统。以下是如何使用它的:

$ top

你会看到一个与 ps 类似的表格,但它会实时更新。就像对你的厨房有一个实时直播!

任务 ID 与进程 ID

最后,让我们澄清任务 ID 和进程 ID 之间的区别:

  • 进程 ID(PID):系统中每个进程的唯一标识符。
  • 任务 ID:分配给在后台启动的进程的编号。

你可以使用以下命令查看任务 ID:

$ jobs

你可以将后台任务带到前台,使用:

$ fg %job_id

记住,任务 ID 仅限于当前的 shell 会话,而 PID 是系统范围的。

就这样,大家!我们已经覆盖了Unix/Linux进程管理的基础。记住,熟能生巧,所以不要犹豫,在你的系统上尝试这些命令。只是在使用 kill 命令时要小心——我们不想在我们的厨房里发生任何意外的终止!

在我们结束之前,我想起了一个我在教学初期发生的有趣事件。我曾经在演示 kill 命令时意外杀死了我的文本编辑器进程,导致我丢失了一个小时未保存的工作。让这成为一个教训——在摆弄进程之前,总是保存你的工作!

继续烹饪那些进程,享受计算吧!

Credits: Image by storyset