- Unix / Linux 初学者
- Unix / Linux - 主页
- Unix / Linux - 入门
- Unix / Linux - 文件管理
- Unix / Linux - 目录
- Unix / Linux - 文件权限
- Unix / Linux - 环境
- Unix / Linux - 基本实用程序
- Unix / Linux - 管道和过滤器
- Unix / Linux - 进程
- Unix / Linux - 通信
- Unix / Linux - vi 编辑器
- Unix/Linux Shell 编程
- Unix / Linux - Shell 脚本
- Unix / Linux - 什么是 Shell?
- Unix / Linux - 使用变量
- Unix / Linux - 特殊变量
- Unix / Linux - 使用数组
- Unix / Linux - 基本运算符
- Unix / Linux - 决策
- Unix / Linux - Shell 循环
- Unix / Linux - 循环控制
- Unix / Linux - Shell 替换
- Unix / Linux - 引用机制
- Unix / Linux - IO 重定向
- Unix / Linux - Shell 函数
- Unix / Linux - 联机帮助页
Unix / Linux - 进程管理
在本章中,我们将详细讨论 Unix 中的进程管理。当您在 Unix 系统上执行程序时,系统会为该程序创建一个特殊的环境。该环境包含系统运行该程序所需的一切,就好像系统上没有运行其他程序一样。
每当您在 Unix 中发出命令时,它都会创建或启动一个新进程。当您尝试使用ls命令列出目录内容时,您启动了一个进程。简单来说,进程就是正在运行的程序的一个实例。
操作系统通过称为pid或进程 ID 的五位 ID 号来跟踪进程。系统中的每个进程都有一个唯一的pid。
Pids 最终会重复,因为所有可能的数字都已用完,下一个 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。您需要知道作业号才能在后台和前台之间操作它。
按 Enter 键,您将看到以下内容 -
[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 |
用户识别码 该进程所属的用户 ID(运行该进程的人) |
2 |
PID 进程号 |
3 |
PPID 父进程ID(启动它的进程的ID) |
4 |
C 进程的CPU利用率 |
5 |
时间 流程开始时间 |
6 |
电传打字机 与进程关联的终端类型 |
7 |
时间 进程占用的CPU时间 |
8 |
指令管理系统 启动此进程的命令 |
还有其他选项可以与ps命令一起使用 -
先生。 | 选项和说明 |
---|---|
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 -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命令是一个非常有用的工具,可以快速显示按各种标准排序的进程。
它是一种交互式诊断工具,经常更新并显示有关物理和虚拟内存、CPU 使用情况、平均负载和繁忙进程的信息。
以下是运行 top 命令并查看不同进程的 CPU 利用率统计数据的简单语法 -
$top
作业 ID 与进程 ID
后台和挂起的进程通常通过作业号(作业 ID)进行操作。该数字与进程 ID 不同,之所以使用它是因为它更短。
此外,一个作业可以由多个串行或同时、并行运行的进程组成。使用作业 ID 比跟踪单个进程更容易。