Unix 简明教程

Unix / Linux - Processes Management

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

在 Unix 中发出命令时,它会创建一个新的进程或者启动一个新的进程。当你尝试 ls 命令以列出目录内容时,你就已经启动了一个进程。进程简单来说是正在运行的程序的一个实例。

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

由于用尽了所有可能的数字,下一个 pid 将滚动或重新开始,所以 pid 最终会重复。在任何时间点,系统中都无法存在两个 pid 相同的进程,因为 pid 是 Unix 用来跟踪每个进程的。

Starting a Process

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

  1. Foreground Processes

  2. Background Processes

Foreground Processes

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

你可以看到这是通过 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 命令需要任何输入(实际上并不需要),它会从键盘上等待输入。

当程序在前台运行且耗时时,不能运行任何其他命令(启动任何其他进程),因为提示符在程序完成处理并退出之前都是不可用的。

Background Processes

后台进程运行时无需连接到你的键盘。如果后台进程需要任何键盘输入,它会等待。

在后台运行进程的优势在于,你可以运行其他命令;你无需等待它完成即可开始另一个命令!

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

$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。你需要了解作业号才能在后台和前台之间对其进行操作。

按 Enter 键,你将看到以下内容 −

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

第一行告诉我们, ls 命令的后台进程已成功完成。第二行提示输入另一个命令。

Listing Running Processes

运行 ps (进程状态)命令很容易看到您自己的进程,具体如下 −

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

One of the most commonly used flags for ps is the -f ( f for full) option, which provides more information as shown in the following example −

$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

Here is the description of all the fields displayed by ps -f command −

Sr.No.

Column & Description

1

UID 用户 ID 属于此进程(运行它的用户)

2

PID Process ID

3

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

4

C CPU utilization of process

5

STIME Process start time

6

TTY 与进程关联的终端类型

7

TIME 进程占用的 CPU 时间

8

CMD 启动这个进程的命令

ps 命令一起使用的其他选项 −

Sr.No.

Option & Description

1

-a 显示所有用户的信息

2

-x 显示没有终端的进程的信息

3

-u 显示类似于 -f 选项的附加信息

4

-e Displays extended information

Stopping Processes

以多种不同的方式结束进程。通常,从基于控制台的命令发送 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 -9 再跟上进程 ID:

$kill -9 6738
Terminated

Parent and Child Processes

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

你运行的大多数命令都以 shell 作为它们的父进程。检查 ps -f 示例,其中此命令列出了进程 ID 和父进程 ID。

Zombie and Orphan Processes

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

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

Daemon Processes

守护程序是相关的背景进程,通常使用 root 权限以其他进程的服务请求来运行。

守护程序不控制本机终端。它无法打开 /dev/tty 。如果您执行 "ps -ef" ,并查看 tty 字段,则所有守护程序的 tty 都为 ?

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

如果您有需要大量处理时间的程序,那么将它设为守护程序并在后台运行非常值得。

The top Command

top 命令是一个非常有用的工具,可以快速按各种条件对进程进行排序。

它是频繁更新并显示物理和虚拟内存、CPU 使用率、平均负载以及繁忙进程的信息的交互式诊断工具。

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

$top

Job ID Versus Process ID

后台和暂停进程通常通过 job number (job ID) 进行控制。此号码不同于进程 ID,并且由于更短而使用。

此外,作业可能包含多个进程,这些进程可能会按顺序或同时并行运行。使用作业 ID 比跟踪各个进程更容易。