unix 后台进程的管理

来源:百度文库 编辑:神马文学网 时间:2024/04/27 16:40:28
 【IT专家网独家】Unix系统中的进程指的是一个具有特定功能的程序,它可以和其他程序共享对某个数据集合的操作。进程被应用程序创建之后,在获得资源时运行。如果得不到资源,就暂时停止直到获得其所需要的资源。进程完成后消忙。故进程与普通程序仍然有所差别。因为进程是动态的,而程序是静态的概念。不过笔者觉得这些描述都不怎么直观。笔者平时在跟大家交流过程中,都把Unxi进程比喻为系统的守护神。他负责与系统CPU之间进行通信并保障系统的正常运行。

  虽然进程是应用软件自动产生的。但是系统工程师在必要的时候仍然要学会对系统进程进行调整。如把某些运行时间比较久的进程放入到后台运行等等。笔者这里就进程管理这个话题,跟大家分享一下自己在这方面的管理经验。

  一、如何查看进程标识?

  进程创建之后,系统就会为其分配一个唯一的标识。进程表示的允许范围是从0到65535的十进制数字。通常情况下,进程标识是循环使用的。如果进程标识达到上界的话,将重新使用比较小的进程号。进程号在系统中的分配原则是必须唯一。所以即使是同一个应用程序发起的进程,发起时间不同其进程号也不同。但是关于进程的很多操作,都是针对进程号来进行的。如要把后台的进程调到前台来或者人工杀死一个不用的进程,都需要知道进程标识。故在进程管理中,系统工程师首先要掌握的一个内容就是如何查看系统的进程号。

  在Unix系统中,可以使用ps –ef命令来查看系统中的所有进程。输入这个命令后,系统会显示当前系统中进程的详细信息。具体来说,会包括如下内容。如UID表示这个进程的所有者;PID表示进程的标识;PPID表示父进程的标识;TTY表示运行进程的终端;COMMMAND表示创建进程的系统命令。

  作为一个合格的Unix系统工程师,要能够从这些信息中得到以下有用的结论。

  一是子进程与父进程的关系。每个进程都只有一个父进程,但是可以有多个子进程。创建其他进程的进程被称为父进程;而这个被创建的进程就是子进程。为什么要区分父子进程呢?如现在系统有三个进程,进程号分别为1001,1002,1003。而进程1003是有进程1001创建的。也就是说进程1001是进程1003所创建的。此时如果由于某种原因手工杀死父进程1001的话,那么它的子进程也会被同时杀死或者说成为“孤儿进程”。为此系统工程师在手工杀死进程的时候,需要先判断一下这个进程是否还创建了其他子进程。只有在确定这些子进程的手工关闭不会对系统产生不利影响之后,系统工程师才能够杀死父进程。而父进程与子进程的明显区别就在于进程标示号(PID)与父进程标识号(PPID)。如果子进程创建成功,则系统fork进程会将子进程的PID传给父进程。故系统工程师要能够根据进程标识号与父进程标识号来判断谁是谁的父进程;在手工关闭父进程时要注意其创建的子进程对系统是否会产生不利影响。

  二是系统创建的进程不能够被手工关闭。在Unix系统启动的时候,系统核心将创建sched进程。然后这个进程又会产生三个子进程,分别为init进程、vhard进程和bdflush进程。这个四个进程的进程标示好分别为0、1、2、3。在核心调度程序为他们分配CPU时间之前,shced把其他程序调度内存。这里Unix系统工程师需要注意的是,不要去尝试着维护这四个进程,如不要想把这个四个进程强制关闭掉。否则的话,工程师会吃不了兜着走。

  二、把前台进程移动到后台去进行。

  有时候出于某些特定的需要,系统工程师可能要把某些在前台运行的进程放入到后台去运行。一个比较感性的例子,就如杀毒软件。全盘杀毒需要比较长的时间。若哪个杀毒的窗口老是用户眼前晃的话,让人很不舒服。为此系统工程师就需要考虑把这个前台正在运行的进程放入到后台运行。在Unix系统中,这个功能经常用到。如工程师可能让系统每天在一个固定的时刻对Home用户文件夹进行备份。为了避免对用户的干扰,可以把这个备份进程放在后台执行。故Unix系统工程师要掌握把前台进程放入到后台执行、把后台作业调入到前台等等相关操作,并能够排除由此产生的一些错误。这也是Unix高级工程师考试时的必备考点之一。

  1、如何把前台作业移动到后台?

  如果为了在运行进程时可以进行其他工作,工程师可以让某个进程在后台执行。注意如果把进程放入到后台运行,则系统当前运行的shell会给这个进程分配一个作业号。注意,由于作业号不是操作系统分配的,而是shell分配的,故它只代表了后台运行的活动进程。最要命的是,它在操作系统中并不是唯一的。

  若要把一个正在执行的进程放入到后台,则首先需要把正在执行的进程挂起。系统工程师若要把正在执行的进程挂起的话,可以采用挂起键。工程师可以在进程执行过程中,暂停他的执行过程,并在以后继续执行。这个操作在Unix中叫做挂起。通称情况下,系统工程师之能够挂起一个当前shell下的作业(不过这对系统工程师来说已经足够了)。挂起作业的方法主要有两种,一是按CTRL+Z键,二是按系统当前定义的挂起建。把进程挂起后再使用bg命令把挂起的进程放入到后台运行。这个命令的格式为,bg % 进程标示号或者作业号、命令名等等。笔者这里建议是采用进程的标识号,而不是作业号。因为作业号在系统中并不唯一。故可能会引发一些误操作。

 

  2、如何把后台作业移动到前台?

  有时候管理员需要把后台进程移动到前台。如系统工程师发现后台进程迟迟没有完成,怀疑这个进程有问题,需要手工关闭它。通常情况下,系统工程师是无法强制关闭后台进程的。若要关闭后台进程,必须先把后台进程移动到前台,然后再用关闭进程命令关闭。也就是说,为了中断一个后台作业,可以先把它移动到前台,然后再使用前台中的中断控制进程指令来实现。

  把后台进程作业移动到前台的命令是fg,后接%标志,然后指名进程标识号或者命名命名、作业号等等。在执行这个命令的时候,笔者说明两点。一是把后台作业移动到前台与把前台作业移动到后台有一个显著的区别。就是把后台作移动到前台不用把后台正在执行的进程移动到前台。换句话说,在后台执行的进程系统工程师无法进行干预。即无法杀死进程,也无法挂起进程。除非等着进程自动执行完毕,否则的话工程师对于后台的进程无能为力。二是由于作业号在系统中不唯一,故利用作业号来管理后台进程并不是很好的方法。如现在恰巧有两个作业号相同的后台进程,那么当工程师要把某个作业号的进程掉到前台运行的时候,系统就不知道到底要调哪一个了。故笔者是建议大家通过唯一的进程标识号来管理后台进程。

  3、如何查看正在运行的作业?

  当系统工程师发现把进程放入后台后迟迟没有反应,就会担心是否哪里出了问题,就需要查看当前进程的工作状态。此时系统工程师可以通过jobs命令显示当前进程的工作状态。通常情况下,显示进程的状态主要为运行、中断、等待输入或者停止。如果进程的状态为后面三种,则系统工程师就要把它们调入到前台,来分析进程遇到的问题。