Unix 简明教程
Unix / Linux - Processes Management
在本章中,我们将详细讨论 Unix 中的进程管理。当你在 Unix 系统中执行程序时,系统会为该程序创建一个特殊环境。此环境包含系统运行该程序所需的一切,就好像系统中没有其他程序在运行一样。
在 Unix 中发出命令时,它会创建一个新的进程或者启动一个新的进程。当你尝试 ls 命令以列出目录内容时,你就已经启动了一个进程。进程简单来说是正在运行的程序的一个实例。
操作系统通过一个五位数的 ID 号来跟踪进程,该 ID 号被称为 pid 或 process ID 。系统中的每个进程都有一个唯一的 pid 。
由于用尽了所有可能的数字,下一个 pid 将滚动或重新开始,所以 pid 最终会重复。在任何时间点,系统中都无法存在两个 pid 相同的进程,因为 pid 是 Unix 用来跟踪每个进程的。
Starting a Process
启动进程(运行命令)时,有两种方法可以运行它 −
-
Foreground Processes
-
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 都为 ? 。
准确地说,守护程序是在后台运行,通常等待能够处理的事情发生。例如,打印机守护程序将等待打印命令。
如果您有需要大量处理时间的程序,那么将它设为守护程序并在后台运行非常值得。