杀死Unix操作系统下不服管教的进程
进程是Unix系统的是守护神。可是有时候这个守护神也会闹别扭,会跟Unix操作系统作对。如明明任务已经执行完成了,但是却没有正常结束进程。又或者进程无缘无故占用了大量的系统资源,导致系统速度减慢,影响了其他作业的正常运行。对于这些不服管教的进程,系统工程师只能够拿起手中的屠刀,实行"杀无赦"政策。
在Unix系统中有多种手段可以杀死这些异常的进程。通常情况下,笔者建议是杀进程的工作要有序的进行,尽量采取一些对操作系统影响小的方法。
第一阶段:在本机上杀死进程。
系统工程师可以直接在Unix系统的命令中断采用相关的命令来杀死异常进程。如可以按键盘上的DEL键、Ctrl D键、Break键等等杀死进程。系统工程师按下这些键的任何一个,都会向系统进程发送中断信号。注意,通常情况下只有root用户才能够杀死其他拥护的进程或者系统进程;而其他用户只能够杀死自己的进程。如现在Unix系统中要部署一个oracle数据库服务器。为了管理方便,Unix系统工程师建立了一个Oracle用户,用来进行数据库系统的维护与管理。此时,Oracle这个用户就会运行几个进程,如tns等进程。正常情况下,Oracle用户以及root用户都可以杀死这个进程。但是如果这个系统中还有其他用户,则无法杀死这个进程。
另外如果用户想杀的进程是shell的子进程,则还可以采用kill命令家进程的作业号的方式。如kill % 作业号等等。Shell是Unix系统中很好的一个交互工具,也有人把它叫做命令行界面,是Unix操作系统下最传统、历史最悠久的用户和计算机的交互截面。系统管理员可以在这里直接输入相关的命令来执行各种各样的维护任务,包括杀死异常进程等等。其实它跟微软操作系统下的命令行界面很相似,不过也有一些差异的地方。如Unix操作系统下的shell既是用户与系统交互的界面,也是控制系统的脚本语言。这就是两者最大的差异。Shell做重要的特点就是隐藏了操作系统的底层细节,故对于工程师来说这是首选的维护系统的工具。
其实大部分时候工程师都是在shell环境下管理进程,包括上篇文章中谈到的查看进程信息、把后台进程调到前台等等。故在本机上杀死进程也大部分是在shel环境下进行。为此系统工程师用的更多的可能还是利用kill命令来杀死shell子进程。
第二阶段:从另一个终端来杀进程。
有时候可能进程比较顽固,若从当前终端来杀它的话,还杀不掉。此时管理员就可以通过曲线救国的方式,从另一个终端登陆到Unix操作系统,然后采用kill命令来杀死异常进程。这个主要的步骤如下。
第一步从另一个终端登陆操作系统。通常情况下,Unix系统支持多个终端。当系统工程师发现在当前终端无法杀死某个进程的话,则不用急于通过重新启动或者强制关机等方式来杀死这些杀不掉的进程。这是下下之策。遇到这种情况,系统工程师可以从另外一个终端登陆到操作系统,然后尝试使用kill命令来杀死进程。
第二步使用ps –u命令来查找需要杀死进程所对应的进程号或者作业号。ps 命令将活动进程的当前状态和有关的内核线程写到标准输出中。这个命令有很多参数,如-m、-l、s、u 和 v等等。注意当采用-m参数时则系统将使用额外的行显示与进程相关的线程。不带任何参数时,ps 命令将会显示关于当前工作站的信息。而使用-o参数时,ps命令检查内存或调页区域并确定进程创建时的命令名和参数是什么。如果 ps 命令不能找到该信息,存储在内核中的命令名显示在方括号中。如果想快速查找特定作业的进程信息,采用-u参数是不错的选择。如ps –u oracle 等等。
第三步使用kill命令杀死异常进程,如kill 26014。Kill命令就会向目标进程发送一个信号以中断这个进程。通常情况下,此时就可以杀死那些比较顽固的进程。如果在kill命令后面没有加上进程号或者作业号,则系统会采用默认的信号值15,这是一个终止命令。如果此时还没有杀死这个进程的话,那么可以采用更强烈的方式,即kill -9 进程号。对于顽固进程来说,这条命令可能会更加有用。这主要是因为这个命令使进程在接收到中断信号后,不能关闭它在使用的任何文件。正是因为有这个后遗症,故只有在采用上面那几种手段无效的情况下,才推荐使用这个终极杀手。
第三阶段:通过父进程来杀死子进程。
在unix操作系统中,进程有父子进程的关系。某个进程可能会创建另外一个进程,这个创建者就是父进程,而新建立的进程就是子进程。通常情况下,如果停止了一个父进程,则该父进程产生的所有子进程都将自动终止。但是,这个过程可能会破坏数据文件或者其他一些难以预料的结果。故正常情况下,笔者是建议系统工程师先关闭掉所有的子进程,然后再关闭父进程。
但是,当采取了任何手段,包括kill -9手段之后仍然无法正常杀死顽固进程之后,系统工程师只好采用这个终极杀手,即通过关闭父进程来自动关闭不听话的子进程。但是,正如上面所说的,这很可能会导致一些连锁反映。所以在采用这种方式之前,系统工程师还是要预先估计一下可能会带来的后果。如可以把这个父进程所产生的子进程能够关闭的先关闭掉。然后再通过杀死父进程来自动终止子进程。这可以把对操作系统的不利影响降低到最低。
第四阶段:利用系统注销功能来关闭杀不掉的进程。
若通过关闭父进程仍然杀不死子进程的话,那么管理员还可以通过注销系统的方式来杀死进程。这就好象Windows系统注销一样,会关闭当前的所有进程与任务。不过有时候系统工程师可能不想关闭所有的进程,如一些关系到服务器运行的进程。此时,系统工程师在注销系统之前,需要采取一定的手段,让系统注销后仍然能够保持某些进程正常运转。如果系统工程师想在系统注销后仍然执行一个或者多个进程,则可以采用nohup命令。如此设置后,即使在系统注销后,在后台执行的进程仍然可以继续执行,不会终止。这个手段就可以把系统注销对于用户的不利影响降低到最低。如果Unix操作系统是企业中的一台服务器,而不是客户端,那么这个特性将会对企业很有利。
nohup命令运行由Command参数和任何相关的Arg参数指定的命令,而忽略所有挂断信号。为此在系统注销后仍然可以使用nohup命令运行后台中的程序。注意无论是否将 nohup命令的输出重定向到终端,输出都将附加到当前目录的nohup.out 文件中。如果当前目录的nohup.out文件不可写,则输出重定向到$HOME/nohup.out 文件中。如果上面这些文件都不可以用的话,那么Command参数指定的命令不可调用。故系统工程师如果事后要查看这些系统注销后仍然运行在后台进程的结果,就可以依次查看以上这两个文件。
操作系统注销后,通常再顽固的进程都会被杀死掉。不过有时候会因为进程实在难缠,注销的过程时间可能会比较长。若操作系统在长时间后仍然无法注销的话,那只有强制重新启动电脑了。不过重新启动后很可能会出现启动故障。为此,重新启动系统来终止进程是不得已而为止的做法了。
关键词标签:Unix操作系统