进程

通常,现在的操作系统都支持多任务,意味着操作系统(给用户)造成了一种假象,(让用

户觉得) 它同时能够做多件事情,事实上,它是快速地轮换执行这些任务的。Linux 内核通过
使用进程,来管理多任务。通过进程,Linux 安排不同的程序等待使用 CPU。
有时候,计算机变得呆滞,运行缓慢,或者一个应用程序停止响应。在这一章中,我们将
看一些可用的命令行工具,这些工具帮助我们查看程序的执行状态,以及怎样终止行为不当的
进程。
这一章将介绍以下命令:
• ps –报告当前进程快照
• top –显示任务
• jobs –列出活跃的任务
• bg –把一个任务放到后台执行
• fg –把一个任务放到前台执行
• kill –给一个进程发送信号
• killall –杀死指定名字的进程
• shutdown –关机或重启系统

进程是怎样工作的
当系统启动的时候,内核先把一些它自己的程序初始化为进程,然后运行一个叫做 init 的
程序。init,依次地,再运行一系列的称为 init 脚本的 shell 脚本(位于/etc),它们可以启动
所有的系统服务。其中许多系统服务以守护(daemon)程序的形式实现,守护程序仅在后台
运行,没有任何用户接口。这样,即使我们没有登录系统,至少系统也在忙于执行一些例行事务.

一个程序可以发动另一个程序,这个事实在进程方案中,表述为一个父进程创建了一个子进程。

内核维护每个进程的信息,以此来保持事情有序。例如,系统分配给每个进程一个数字,
这个数字叫做进程 ID 或 PID。PID 号按升序分配,init 进程的 PID 总是 1。内核也对分配给
每个进程的内存进行跟踪。像文件一样,进程也有所有者和用户 ID,有效用户 ID,等等。

查看进程
查看进程,最常使用地命令(有几个命令)是 ps。ps 程序有许多选项,它最简单地使用形
式是这样的:

上例中,列出了两个进程,进程 5198 和进程 10129,各自代表命令 bash 和 ps。正如我们
所看到的,默认情况下,ps 不会显示很多进程信息,只是列出与当前终端会话相关的进程。为
了得到更多信息,我们需要加上一些选项,但是在这样做之前,我们先看一下 ps 命令运行结
果的其它字段。TTY 是 “Teletype” 的简写,是指进程的控制终端。这里,Unix 展示它的年
龄。TIME 字段表示进程所消耗的 CPU 时间数量。正如我们所看到的,这两个进程使计算机
工作起来很轻松。
如果给 ps 命令加上选项,我们可以得到更多关于系统运行状态的信息:

加上 “x” 选项(注意没有开头的”-“ 字符),告诉 ps 命令,展示所有进程,不管它们由什么
终端(如果有的话)控制。在 TTY 一栏中出现的 “?” ,表示没有控制终端。使用这个 “x” 选
项,可以看到我们所拥有的每个进程的信息。

因为系统中正运行着许多进程,所以 ps 命令的输出结果很长。这经常很有帮助,要是把 ps
的输出结果管道到 less 命令,借助 less 工具,更容易浏览。一些选项组合也会产生很长的输出
结果,所以最大化终端仿真器窗口,也是一个好主意。
输出结果中,新添加了一栏,标题为 STAT 。STAT 是 “state” 的简写,它揭示了进程当前状态

进程状态信息之后,可能还跟随其他的字符。这表示各种外来进程的特性。详细信息请看ps 手册页。

另一个流行的选项组合是 “aux”(不带开头的 “-” 字符)。这会给我们更多信息.

这个选项组合,能够显示属于每个用户的进程信息。使用这个选项,可以唤醒“BSD 风格”
的输出结果。Linux 版本的 ps 命令,可以模拟几个不同 Unix 版本中的 ps 程序的行为。通过
这些选项,我们得到这些额外的列。

用 top 命令动态查看进程
虽然 ps 命令能够展示许多计算机运行状态的信息,但是它只是提供,ps 命令执行时刻的机
器状态快照。为了看到更多动态的信息,我们使用 top 命令

top 程序接受一系列从键盘输入的命令。两个最有趣的命令是 h 和 q。h,显示程序的帮助
屏幕,q,退出 top 程序。
两 个 主 要 的 桌 面 环 境 都 提 供 了 图 形 化 应 用 程 序,来 显 示 与 top 程 序 相 似 的 信 息(和
Windows 中的任务管理器差别不多),但是我觉得 top 程序要好于图形化的版本,因为它运行
速度快,并且消费很少的系统资源。毕竟,我们的系统监测程序不能成为系统怠工的源泉,而
这是我们试图追踪的信息。

控制进程
现在我们可以看到和监测进程,然后得到一些对它们的控制权。为了我们的实验,我们将
使用一个叫做 xlogo 的小程序,作为我们的实验品。这个 xlogo 程序是 X 窗口系统(底层引擎
使图形界面显示在屏幕上)提供的实例程序,这个实例简单地显示一个大小可调的包含 X 标志
的窗口。首先,我们需要知道测试的主题

中断一个进程
我们再运行 xlogo 程序一次,观察一下发生了什么事。首先,执行 xlogo 命令,并且证实这
个程序正在运行。下一步,回到终端窗口,按下 Ctrl-c。

在一个终端中,输入 Ctrl-c,中断一个程序。这意味着,我们礼貌地要求终止这个程序。输
入 Ctrl-c 之后,xlogo 窗口关闭,shell 提示符返回。
通过这个技巧,许多(但不是全部)命令行程序可以被中断。

把一个进程放置到后台 (执行)
比方说,我们想让 shell 提示符返回,却没有终止 xlogo 程序。为达到这个目的,我们把这
个程序放到后台执行。把终端看作是一个有前台(表层放置可见的事物,像 shell 提示符)和

后台(表层之下放置隐藏的事物)(的设备)。启动一个程序,让它立即在后台运行,我们在程
序命令之后,加上 “&” 字符

 

执行命令之后,这个 xlogo 窗口出现,并且 shell 提示符返回,同时打印一些有趣的数字。
这条信息是 shell 特性的一部分,叫做工作控制。通过这条信息,shell 告诉我们,已经启动了
工作号为 1(“[1]”),PID 为 28236 的程序。如果我们运行 ps 命令,可以看到我们的进程:

工作控制,这个 shell 功能可以列出从终端中启动的任务。执行 jobs 命令,我们可以看到
这个输出列表

结果显示我们有一个任务,编号为“1”,它正在运行,并且这个任务的命令是 xlogo &。

进程返回到前台
一个在后台运行的进程对一切来自键盘的输入都免疫,也不能用 Ctrl-c 来中断它。使用 fg
命令,让一个进程返回前台执行

停止一个进程
有时候,我们想要停止一个进程,而没有终止它。这样会把一个前台进程移到后台等待。
输入 Ctrl-z,可以停止一个前台进程。让我们试一下。在命令提示符下,执行 xlogo 命令,然
后输入 Ctrl-z:

和 fg 命令一样,如果只有一个任务的话,jobspec 参数是可选的。
因为把一个进程从前台移到后台很方便,如果我们从命令行启动一个图形界面的程序,但
是忘记把它放到后台执行,即没有在命令后加上字符 “&”,(也不用担心)。
为什么要从命令行启动一个图形界面程序呢?有两个原因。第一个,你想要启动的程序,
可能没有在窗口管理器的菜单中列出来(比方说 xlogo)。第二个,从命令行启动一个程序,你
能够看到一些错误信息,如果从窗口系统中运行程序的话,这些信息是不可见的。有时候,一
个程序不能从图形界面菜单中启动。这时候,应该从命令行中启动它。我们可能会看到错误信
息,这些信息揭示了问题所在。一些图形界面程序还有许多有意思并且有用的命令行选项。
kill 命令被用来“杀死”程序。这样我们就可以终止需要杀死的程序。这里有一个实例

首先,我们在后台启动 xlogo 程序。shell 打印出 jobspec 和这个后台进程的 PID。下一步,
我们使用 kill 命令,并且指定我们想要终止的进程 PID。也可以用 jobspec(例如,“%1”)
代替 PID。
虽然这个命令很直接了当,但不仅仅这些。这个 kill 命令不是确切地“杀死”程序,而是
给程序发送信号。信号是操作系统与程序之间进行通信,所采用的几种方式中的一种。我们已
经看到信号,在使用 Ctrl-c 和 Ctrl-z 的过程中。当终端接受了其中一个按键组合后,它会给在
前端运行的程序发送一个信号。在使用 Ctrl-c 的情况下,会发送一个叫做 INT(中断)的信
号;当使用 Ctrl-z 时,则发送一个叫做 TSTP(终端停止)的信号。程序,反过来,倾听信号
的到来,当程序接到信号之后,则做出响应。一个程序能够倾听和响应信号,这个事实允许一
个程序做些事情,比如,当程序接到一个终止信号时,它可以保存所做的工作。

通过 kill 命令给进程发送信号
kill 命令被用来给程序发送信号。它最常见的语法形式看起来像这样:

kill -SIGHUP PID的方式要麻烦一点

为了满足读者的好奇心,通过下面的命令可以得到一个完整的信号列表:

通过 killall 命令给多个进程发送信号
也有可能通过 killall 命令,给匹配特定程序或用户名的多个进程发送信号。

下面是 killall命令的语法形式

更多和进程相关的命令
因为监测进程是一个很重要的系统管理任务,所以有许多命令与它相关。玩玩下面几个命令:

下一篇随笔,讲解进程原语,这里先埋下伏笔.

posted @ 2017-10-10 23:42  Crystal_Guang  阅读(318)  评论(0编辑  收藏  举报