Unix/Linux - 进程管理
你好,有抱负的程序设计师们!今天,我们将踏上一段激动人心的旅程,探索Unix/Linux进程的世界。作为你亲切的计算机科学老师,我很高兴引导你了解这个基本概念。如果你是编程新手,不用担心——我们将从基础开始,逐步深入。那么,来一杯咖啡(或者你喜欢的话,来一杯茶),让我们开始吧!
进程是什么?
在我们开始之前,让我们先了解一下进程到底是什么。想象你在一个热闹的厨房里。每个负责特定菜肴的厨师都可以被视为一个进程。他们有自己的原料(资源)、食谱(程序)和目标(输出)。在计算机世界中,进程只是一个正在执行的程序。
启动进程
在Unix/Linux中启动进程就像馅饼一样简单!你可以主要通过两种方式来做:
- 前台进程:键入命令后按回车。
- 后台进程:在命令末尾加上一个与号(&)。
让我们看一些例子:
# 前台进程
$ 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
这个命令会显示进程树,说明父进程和子进程之间的关系。
僵尸进程和孤儿进程
现在,让我们谈谈一些特殊类型的进程:
- 僵尸进程:一个已经执行完毕但仍在进程表中保留条目的子进程。就像一个完成菜肴但还没有打卡下班的厨师。
- 孤儿进程:一个父进程已经完成或终止,但它仍在运行的进程。想象一个主厨已经回家,但副厨师仍在工作。
要查看你是否有任何僵尸进程,可以使用:
$ 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