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命令显示的所有字段的说明 −
序号 | 栏 & 描述 |
---|---|
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 比跟踪单个流程更容易。