加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 钦州站长网 (https://www.0777zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

linux操作:进程

发布时间:2022-10-17 12:54:32 所属栏目:Unix 来源:
导读:  现代操作系统通常都支持多重任务处理(multitasking)。多重任务处理是指系统通过快速切换运行中的程序来实现多任务的同时执行。Linux内核通过使用进程来管理多重任务。进程是Linux用来安排不同程序等待CPU调度的
  现代操作系统通常都支持多重任务处理(multitasking)。多重任务处理是指系统通过快速切换运行中的程序来实现多任务的同时执行。Linux内核通过使用进程来管理多重任务。进程是Linux用来安排不同程序等待CPU调度的一种组织方式。
 
  有时候计算机运行速度会变得很慢,或者应用程序会停止响应。本章将介绍命令行中可用来查看程序当前运行情况以及终止运行异常的进程的一些工具。
 
  本章将介绍以下命令。
 
  1进程如何工作
 
  系统启动时,内核先把它的一些程序初始化为进程,然后运行一个称为init的程序。init程序将依次运行一系列称为脚本初始化(init script)的shell脚本(放在/etc目录下),这些脚本将会启动所有的系统服务。其中的很多服务都是通过守护程序(daemon program)来实现的。而后台程序只是呆在后台做它们自己的事情,并且没有用户界面。因此,即使没有用户登录,系统也在忙于执行一些例行程序。
 
  一个程序的运行可以触发其他程序的运行,在进程系统中这种情况被表述为父进程创建子进程。
 
  内核会保存每个进程的信息以便确保任务有序进行。比如,每个进程将被分配一个称为进程ID(PID,process ID)的号码。进程ID是按递增的顺序来分配的,init进程的PID始终为1。内核也记录分配给每个进程的内存信息以及用来恢复运行的进程就绪信息。和文件系统类似,进程系统中也存在所有者、用户ID、有效用户ID等。
 
  1使用ps命令查看进程信息
 
  用来查看进程信息的命令中(有多个),使用最普遍的就是ps命令。ps命令有很多选项,其中最简单的使用格式如下所示。
 
  ps不带任何选项的输出
 
  这个例子的输出结果列出了两个进程:进程52693和进程52766,它们分别对应bash命令和ps命令。我们可以发现,默认情况下,ps命令输出的信息并不是很多,只是输出和当前终端会话相关的进程信息。为了获得更多的信息,我们需要添加一些选项,但是在介绍这个之前,让我们先看看ps命令输出的其他字段信息。TTY是teletype(电传打字机)的缩写,代表了进程的控制终端(controlling terminal)。UNIX在这里也显示了进程的运行时间,TIME字段表示了进程消耗的CPU时间总和。可以看出,这两个进程都没有使计算机变得忙碌。
 
  如果在ps命令后添加一个选项,那么我们将得到反映系统运行情况的更大视图界面,如下所示。
 
  添加x选项(注意这里没有前置的连字符)将告知ps命令显示所有的进程,而不需要关注它们是由哪个终端(如果有其他的情况)所控制的。TTY列中出现的“?”表示没有控制终端,使用这个选项可以查看所有进程的列表信息。
 
  由于系统中运行着大量的进程,所以ps命令将会输出一个长列表。把ps命令的输出作为less命令输入的方法通常很管用,它可以更方便地查看显示结果。有些选项组合也会产生很长的输出行,因此最大化终端仿真窗口也是一个好主意。
 
  输出结果中添加了一个命名为STAT的新列。STAT是state的缩写,显示的是进程的当前状态,如表10-1所示。
 
  这些进程状态的后面可以带其他的字符来表示不同的特殊进程特性。你可以查看ps命令的帮助页面来获取更多的详细信息。
 
  另一个常用的选项组合是aux(不带前置连字符),它将输出更多的信息,如下所示。
 
  该选项组合将会显示属于每个用户的进程信息,使用这些选项时不带前置连字符将使得命令以“BSD模式(BSD-style)”运行。ps命令的Linux版本可以模拟多种UNIX版本中ps程序的运行方式,使用这些选项将显示更多列的信息,具体如表10-2所示。
 
  2使用top命令动态查看进程信息
 
  top
  虽然ps命令可以显示有关机器运行情况的很多信息unix进程通信,但是它提供的只是在ps命令被执行时刻机器状态的一个快照。要查看机器运行情况的动态视图,我们可以使用top命令,如下所示。
 
  top程序将按照进程活动的顺序,以列表的形式持续更新显示系统进程的当前信息(默认每3秒更新一次)。它主要用于查看系统“最高(top)”进程的运行情况,其名字也来源于此。top命令显示的内容包含两个部分,顶部显示的是系统总体状态信息,下面显示的是一张按CPU活动时间排序的进程情况表。
 
  系统总体状态信息包含很多有用的内容,表10-3将逐条解释这些字段,具体如下。
 
  top程序可以接受许多键盘指令,其中最常用的有两个:一个是h,输入后将显示程序的帮助界面;另一个是q,用来退出top命令。
 
  top在运行状态下键入h2控制进程
 
  既然我们已经知道了如何查看和监控进程,那么接下来让我们看看如何对进程进行控制。我们将使用一个称为xlogo的小程序作为实验对象。Xlogo程序是由X窗口系统(X Window System,使得显示器支持图形化界面的底层引擎)提供的一个示例程序,它只简单地显示一个包含X标识的可缩放窗口。首先,我们认识一下实验对象。
 
  输入该命令后,包含该标识的一个小窗口将在屏幕的某个地方出现。有些系统中,xlogo可能会输出一条告警信息,但是我们可以忽略它,因为它并不会造成什么影响。
 
  注意:
 
  如果系统中不包含xlogo程序,那么试着使用gedit程序或者kwrite程序来替代。
 
  注意,为什么这里shell提示符没有返回呢?这是因为shell正在等待该gredit程序结束,就像以前使用的其他程序一样。如果关闭xlogo窗口,那么提示符将返回。
 
  注意,为什么这里shell提示符没有返回呢?这是因为shell正在等待该gredit程序结束,就像以前使用的其他程序一样。如果关闭gredit窗口,那么提示符将返回。按下Ctrl-C键后,gredit窗口将关闭,shell提示符将返回。
 
  1中断进程
 
  让我们观察再次运行gredit命令的时候会发生什么。首先,输入gredit命令,并确保程序在正常运行。接下来,返回到终端窗口,按下Ctrl-C键。在终端里按下Ctrl-C键将会中断(interrupt)一个程序,它意味着我们委婉地请求程序结束。按下Ctrl-C键后,gredit窗口将关闭,shell提示符将返回。
 
  许多(但不是所有)命令行程序都可以使用这种方法来实现中断。
 
  2使进程在后台运行
 
  假设我们想要shell提示符返回,但又不终止xlogo程序,那么可以通过让该程序在后台(background)运行来实现。我们可以把终端想象为有一个前台(foreground,表面上可见的内容,类似shell提示符)和一个后台(隐藏在表层下面的内容)。要想在启动程序时让该程序在后台运行,可以在命令后面加上和号字符(&)来实现。
 
  数字信息。这条信息是shell的一个称为作业控制(job control)的特性表现。shell通过这条信息来显示已经启动的作业编号为1([1]),其对应的PID是53482。如果执行ps命令,可以查看到当前运行的进程。
 
  shell的作业控制特性也提供了一种方式来查看从该终端启动的所有作业。使用jobs命令可以
 
  3使进程回到前台运行
 
  后台运行的进程不会受到任何键盘输入的影响,包括试图用来中断它的Ctrl-C键。要想使得进程返回到前台来运行,可以使用fg命令来实现,参见下面的例子。
 
  [me@linuxbox ~]$jobs
  [1]+ Runningxlogo &
 
  [me@linuxbox ~]$fg %1
  xlogo
 
  我们可以通过在fg命令后面加上百分比符号和作业编号(称为jobspec选项)来实现这个功能。如果后台只有一个任务,那么可以不带jobspec选项。这个时候按下Ctrl-C键就可以终止xlogo命令。
 
  4停止(暂停)进程
 
  如果我们只是想要暂停进程,而不是终止进程,那么通常需要我们将前台运行的进程移到后台去运行。我们为了暂停前台进程需要按下Ctrl-Z键。让我们试试如下操作,在命令提示符后输入xlogo,按下Enter键后再按下Ctrl-Z键。
 
  [me@linuxbox ~]$xlogo
  [1]+ Stoppedxlogo
 
  [me@linuxbox ~]$
  在暂停xlogo命令后,我们可以通过试图改变xlogo窗口的大小来确认该程序是否真正被暂停了。可以发现,该进程看起来好像死了。这个时候,我们可以使用fg命令让进程在前台恢复运行,也可以使用bg命令让进程移到后台运行:
 
  [me@linuxbox ~]$bg %1
  [1]+ xlogo &
 
  3信号
 
  kill命令通常用来“杀死”(终止)进程,它可以用来终止运行不正常的程序或者反过来拒绝终止的程序。这里有一个例子,如下所示。
 
  [me@linuxbox ~]$xlogo &
 
  [1] 28401
 
  [me@linuxbox ~]$kill 28401
 
  我们首先在后台启动了xlogo程序。shell将打印输出该后台进程的jobspec选项信息和PID信息。接着,我们使用了kill命令,并且指定想要终止进程的PID。我们也可以使用jobspec选项(例如,%1)代替PID信息来指定该进程。
 
  这些看起来都非常简单,但是事实上,它们包含着更多的内容。kill命令准确地说并不是“杀死”进程,而是给进程发送信号(signal)。信号是操作系统和程序间通信的多种方式之一,在使用Ctrl-C键和Ctrl-Z键时已经见识过信号的作用。当终端接收到其中的一个输入时,它将发送信号到前台进程。在按下Ctrl-C键的情况下,它将发送一个称为INT(中断,Interrupt)的信号;在按下Ctrl-Z的情况下,它将发送一个称为TSTP(终端暂停,Terminal Stop)的信号。反过来,程序“侦听”信号,而且在接收到信号的时候按照它们的指示进行操作。程序可以侦听信号并且可以按照信号指示操作的这一特性,使得程序在接收到终止信号的时候可以保存当前正在进行的工作。
 
  1使用kill命令发送信号到进程
 
  kill命令最常用的语法格式如下。
 
  kill [-signal] PID……
  如果命令行中没有指定信号,那么默认发送TERM(终止,Terminate)信号。kill命令最常用来发送的信号如表10-4所示。
 
  unix socket 通信框架_unix进程通信_unix丢进程
 
  常用信号
 
  按照下面的方式使用kill命令。
 
  [me@linuxbox ~]$xlogo &
 
  [1] 13546
 
  [me@linuxbox ~]$kill -1 13546
 
  [1]+ Hangupxlogo
 
  在这个例子中,我们首先在后台启动了xlogo程序,接着使用kill命令给它发送HUP信号。xlogo程序将终止,shell的输出信息表明这个后台进程已经接收了一个挂起信号。你也许需要多敲几次Enter键才能看到这条输出信息。注意,你可以通过信号编号或者信号名来指定信号,其中包含带有SIG前缀的信号名。.
 
  [me@linuxbox ~]$xlogo &
 
  [1] 13601
 
  [me@linuxbox ~]$kill -INT 13601
 
  [1]+ Interruptxlogo
 
  [me@linuxbox ~]$xlogo &
 
  [1] 13608
 
  [me@linuxbox ~]$kill -SIGINT 13608
 
  [1]+ Interruptxlogo
 
  尝试使用其他的信号重复执行上面的例子。记住,你也可以使用jobspec选项来代替PID信息。
 
  和文件一样,进程也有所有者,只有进程的所有者(或者超级用户)才能使用kill命令来给它发送信号。
 
  送信号。
 
  除了表10-4中列出的通常用于kill命令的信号之外,还存在其他一些经常被系统使用的信号。表10-5列出的是其他的一些常用信号。
 

(编辑:PHP编程网 - 钦州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章