上一章Unix和Linux教程请查看:Unix和Linux管道和过滤器使用
在本章中我们将详细讨论Unix中的进程管理。当你在Unix系统上执行一个程序时,系统会为该程序创建一个特殊的环境,这个环境包含系统运行程序所需的一切,就好像系统上没有其他程序在运行一样。
无论何时在Unix中发出命令,它都会创建或启动一个新进程。尝试使用ls命令列出目录内容时启动了一个进程。简单地说进程是正在运行的程序的实例,操作系统通过称为pid或进程ID的五位数ID来跟踪进程,系统中的每个进程都有一个惟一的pid。
pid最终会重复,因为所有可能的数字都用完了,下一个pid会滚动或重新开始。在任何时候系统中都不存在两个具有相同pid的进程,因为Unix使用pid来跟踪每个进程。
一、开启一个进程当你启动一个进程(运行一个命令)时,有两种方法可以运行它:
- 前台进程
- 后台进程
默认情况下我们启动的每个进程都在前台运行,它从键盘获取输入并将输出发送到屏幕,使用ls命令可以看到这种情况。如果希望列出当前目录中的所有文件,可以使用以下命令:
$ls ch*.xml
这将显示所有文件:其名称以ch开头以.xml结尾
进程在前台运行而输出被定向到我的屏幕,如果ls命令需要任何输入(它不需要),它将从键盘等待输入。
虽然程序在前台运行而且很耗时,但是不能运行其他命令(启动任何其他进程),因为提示符在程序完成处理并发出之前是不可用的。
2、后台进程
后台进程在没有连接到键盘的情况下运行。如果后台进程需要任何键盘输入它会等待。在后台运行进程的好处是可以运行其他命令:你不必等到它完成后再启动另一个,启动后台进程的最简单方法是在命令末尾添加& 。
$ls ch*.xml &
在这里如果ls命令需要任何输入(它不需要),它将进入停止状态,直到我们将它移到前台,并将键盘上的数据提供给它。第一行包含关于后台进程的信息——作业编号和进程ID。
你需要知道任务编号,以便在后台和前台之间操作它。按下回车键你会看到以下画面:
[1]+Donels ch*.xml &
$
第一行告诉你ls命令后台进程成功完成,第二个是另一个命令的提示符。
二、查看正在运行的进程运行ps(进程状态)命令很容易看到您自己的进程如下所示:
$ps
PIDTTYTIMECMD
1974 pts/1300:00:00 bash
2415 pts/1300:00:00 ps
ps最常用的标志之一是-f (f for full)选项,它提供了更多信息,如下面的示例所示:
$ ps -f
UIDPIDPPIDC STIME TTYTIME CMD
user197419730 16:24 pts/1300:00:00 -bash
user241619740 17:22 pts/1300:00: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 显示扩展信息 |
如果一个进程在后台运行,你应该使用ps命令获取它的进程ID,然后你可以使用kill命令来终止进程如下所示:
$ ps -f
UIDPIDPPIDC STIME TTYTIME CMD
user197419730 16:24 pts/1300:00:00 -bash
user241719740 17:28 pts/1300:00:00 ps -f
$ kill 1974
Terminated
另外如果一个进程忽略了一个常规的kill命令,你可以使用kill -9后跟进程ID。
四、父进程和子进程每个unix进程都有两个分配给它的ID号:程ID (pid)和父进程ID (ppid)。系统中的每个用户进程都有一个父进程。
你运行的大多数命令都将shell作为它们的父命令,可以查看ps -f示例该命令列出了进程ID和父进程ID。
五、僵死进程和孤立进程通常当子进程被杀死时,父进程通过SIGCHLD信号进行更新。然后父进程可以执行其他任务,或者根据需要重新启动新的子进程。然而有时父进程在它的子进程被杀死之前就被杀死了。
在本例中“所有进程的父进程”(init进程)成为新的PPID(父进程ID)。在某些情况下这些进程被称为孤立进程。当一个进程被杀死时,ps列表仍然可以显示进程的Z状态。这是一个僵死的进程:进程已死而且不能使用,这些过程与孤立过程不同,他们已经完成了执行,但是仍然在进程表中找到了一个条目。
六、守护程序守护进程是与系统相关的后台进程,它通常使用根进程的权限和来自其他进程的服务请求来运行。守护进程没有控制终端,它无法打开/dev/tty。如果执行“ps -ef”并查看tty字段,所有守护进程对于tty都将有一个?。
确切地说守护进程是在后台运行的进程,通常等待它能够处理的事情发生。例如等待打印命令的打印机守护进程。如果你有一个需要长时间处理的程序,那么有必要让它成为一个守护进程并在后台运行它。
七、top命令上面的命令top命令是一个非常有用的工具,用于快速显示根据各种标准排序的进程。它是一个交互式诊断工具,经常更新并显示有关物理和虚拟内存、CPU使用情况、平均负载和繁忙进程的信息。运行top命令和查看不同进程的CPU使用率统计数据的简单语法:$top。
八、作业ID与进程ID【Unix和Linux进程管理操作和使用原理介绍】后台进程和挂起进程通常通过作业编号(作业ID)进行操作。这个数字与进程ID不同,使用它是因为它更短。此外作业可以由多个进程组成,这些进程可以连续运行,也可以同时并行运行,使用作业ID比跟踪单个进程更容易。
推荐阅读
- Unix和Linux常用网络通信工具使用介绍
- Unix和Linux管道(pipe)和过滤器(filter)使用介绍
- Unix和Linux基本工具(打印文件和发送邮件)
- 如何在JavaScript中对字符串排序()
- C++ STL中的accumulate()和partial_sum()(数字标头)
- 检查一个字符串是否是另一个的子字符串
- JavaScript Gallery插件用法介绍
- 我应该如何自己开始学习道德黑客()
- 左偏树/左偏堆实现原理和代码实现指南