Unix / Linux - 进程管理

在本章中,我们将详细讨论 Unix 中的进程管理。 当你在你的 Unix 系统上执行一个程序时,系统会为那个程序创建一个特殊的环境。 该环境包含系统运行程序所需的一切,就好像系统上没有其他程序在运行一样。

无论何时您在 Unix 中发出命令,它都会创建或启动一个新进程。 当您尝试使用 ls 命令列出目录内容时,您启动了一个进程。 进程,简单来说,就是一个正在运行的程序的实例。

操作系统通过称为 pid进程 ID 的五位数 ID 号跟踪进程。 系统中的每个进程都有一个唯一的pid

Pid 最终会重复,因为所有可能的数字都用完了,下一个 pid 会滚动或重新开始。 在任何时候,系统中都不存在具有相同 pid 的两个进程,因为它是 Unix 用来跟踪每个进程的 pid。


开始进程

当你启动一个进程(运行一个命令)时,有两种方法可以运行它 −

  • 前台进程
  • 后台进程

前台进程

默认情况下,您启动的每个进程都在前台运行。 它从键盘获取输入并将其输出发送到屏幕。

您可以使用 ls 命令看到这种情况。 如果你想列出你当前目录下的所有文件,你可以使用下面的命令 −

$ls ch*.doc

这将显示所有名称以 ch 开头并以 .doc 结尾的文件 −

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

该进程在前台运行,输出定向到我的屏幕,如果 ls 命令需要任何输入(它不需要),它会等待来自键盘的输入。

当一个程序在前台运行并且很耗时时,不能运行其他命令(启动任何其他进程),因为在程序处理完并出来之前不会出现提示。

后台进程

后台进程在未连接到键盘的情况下运行。 如果后台进程需要任何键盘输入,它会等待。

在后台运行进程的好处是可以运行其他命令; 您不必等到它完成再开始!

启动后台进程的最简单方法是在命令末尾添加一个符号 (&)。

$ls ch*.doc &

这将显示名称以 ch 开头并以 .doc 结尾的所有文件 −

ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc   ch02-1.doc

在这里,如果 ls 命令需要任何输入(它不需要),它会进入停止状态,直到我们将它移到前台并从键盘向它提供数据。

第一行包含有关后台进程的信息 - 作业编号和进程 ID。 您需要知道作业编号才能在后台和前台之间操作它。

按回车键,会看到如下内容 −

[1]   +   Done                 ls ch*.doc &
$

第一行告诉您 ls 命令后台进程成功完成。 第二个是另一个命令的提示。


列出正在运行的进程

运行ps(进程状态)命令可以很容易的看到自己的进程如下 −

$ps
PID       TTY      TIME        CMD
18358     ttyp3    00:00:00    sh
18361     ttyp3    00:01:31    abiword
18789     ttyp3    00:00:00    ps

ps 最常用的标志之一是 -f(f 表示完整)选项,它提供了更多信息,如以下示例所示 −

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f

这里是ps -f命令显示的所有字段的说明 −

还有其他选项可以与ps命令一起使用 −

序号 栏 & 描述
1

UID

这个进程所属的用户ID(运行它的人)

2

PID

进程 ID

3

PPID

父进程ID(启动它的进程ID)

4

C

进程的CPU利用率

5

STIME

进程开始时间

6

TTY

与进程关联的终端类型

7

TIME

进程占用的CPU时间

8

CMD

启动这个进程的命令

序号 选项 & 描述
1

-a

显示所有用户的信息

2

-x

显示有关没有终端的进程的信息

3

-u

显示附加信息,如 -f 选项

4

-e

显示扩展信息


停止进程

可以通过几种不同的方式结束进程。 通常,从基于控制台的命令发送 CTRL + C 击键(默认中断字符)将退出命令。 这在进程以前台模式运行时有效。

如果一个进程在后台运行,您应该使用 ps 命令获取其作业 ID。 之后可以使用kill命令杀掉进程如下 −

$ps -f
UID      PID  PPID C STIME    TTY   TIME CMD
amrood   6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood   6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood   3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood   6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated

这里,kill 命令终止了 first_one 进程。 如果进程忽略常规的 kill 命令,您可以使用 kill -9 后跟进程 ID,如下所示 −

$kill -9 6738
Terminated

父进程和子进程

每个 unix 进程都分配有两个 ID 号:进程 ID (pid) 和父进程 ID (ppid)。 系统中的每个用户进程都有一个父进程。

您运行的大多数命令都将 shell 作为其父级。 查看 ps -f 示例,其中此命令列出了进程 ID 和父进程 ID。


僵尸进程和孤儿进程

通常,当一个子进程被杀死时,父进程会通过一个SIGCHLD信号更新。 然后父母可以做一些其他任务或根据需要重新启动一个新的子进程。但是,有时父进程会在其子进程被杀死之前被杀死。 在这种情况下,"所有进程的父进程"init 进程成为新的 PPID(父进程 ID)。 在某些情况下,这些进程称为孤儿进程。

当进程被终止时,ps 列表可能仍会显示进程的 Z 状态。 这是一个僵尸进程或死进程。 该进程已死且未被使用。 这些进程不同于孤儿进程。 他们已经完成执行但仍然在进程表中找到一个条目。


守护进程

守护进程是与系统相关的后台进程,通常在 root 权限和来自其他进程的服务请求下运行。

守护进程没有控制终端。 它无法打开 /dev/tty。如果你执行 "ps -ef" 并查看 tty 字段,所有守护进程都会有 ? 表示 tty

准确地说,守护进程是一个在后台运行的进程,通常等待它能够处理的事情发生。 例如,等待打印命令的打印机守护进程。

如果您有一个需要长时间处理的程序,那么值得将其设为守护进程并在后台运行。


top 命令

top 命令是一个非常有用的工具,可以快速显示按各种标准排序的进程。

它是一种交互式诊断工具,经常更新并显示有关物理和虚拟内存、CPU 使用率、平均负载和繁忙进程的信息。

这是运行 top 命令并查看不同进程的 CPU 使用率统计信息的简单语法 −

$top

作业 ID 与进程 ID

后台和挂起的进程通常通过作业号(作业ID)来操作。 此编号与进程 ID 不同,使用它是因为它更短。

此外,一个作业可以由多个连续运行或同时并行运行的进程组成。 使用作业 ID 比跟踪单个流程更容易。