分享
 
 
 

进程管理

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

在Linux系统上运行的任何东西,每一个用户的工作、每一个系统监控程序等等都是以进程的形式运行的。因此进程管理是Linux系统管理非常重要的一个方面。在这一章,我们将详细介绍如何管理进程:

■ 如何查找系统中运行的进程。

■ 找出扰乱系统的进程。

■ 如何发现一个进程被死锁。

■ 如何终止一个进程。

■ 如何管理进程。

在本章,我们将不讨论进程工作的具体步骤以及Linux内核在运行一个多用户多操作系统的同时如何管理各进程的运行;我们将着重讨论那些用户所需要的、让系统正常工作的进程管理活动。

在接触多用户和多任务操作系统时,您也许经常遇到进程和作业两个术语。对于多数情况,这两个术语都是正确的。然而,作业通常是指由shell启动的一个进程或多个进程,而进程是一个正在执行的单一实体。在本章,我们将统一使用进程这个术语。

什么是进程

进程是一个正在运行的程序。也就是说在Linux系统上运行的所有东西都是进程。和进程相比较,作业是一系列按一定顺序执行的命令。一条简单的命令可能会涉及多个进程,尤其是当使用管道和重定向时。例如命令:

# nroff –man ps.1 | grep kill | more

将产生三个进程,每一条命令一个。

Linux操作系统有好几种进程,每一种都有其各自的品质和特性。下面给出了Linux系统的三种进程:

■ 交互式进程:一个由shell启动并控制的进程。交互式进程既可在前台也可在后台运行。

■ 批处理进程:与终端无关,安排在指定时刻完成的一系列进程。

■ 守护进程:在引导系统时起动,以执行即时的操作系统任务,如 lpd、inetd、named等。

ps命令

找出系统中正在运行的进程的最简便的方法是使用ps(process status)命令。尽管多数系统管理员只使用ps命令的几种形式,该命令还有很多其它的命令行参数。我们将从最简单的ps命令开始,由浅入深的介绍一些有用的参数。

和root 一样,系统中所有的用户都可以使用ps命令,但这会和以root身份登录进系统时使用该命令得到的输出略有不同。当普通用户登录进系统使用ps命令,他们只能看到自己所运行的所有进程,下面就是一个例子:

 $ ps

PID TTY STAT TIME COMMAND

41 v01 S 0:00 -bash

134 v01 R 0:00 ps

ps命令的输出

ps命令通常以行列的形式输出结果。 系统中的每一个进程都有一个唯一的标志符以便Linux可以识别它们。Linux通过给每一个进程分配唯一的数码来处理进程,这个数码叫做进程ID号(或PID号)。PID号当系统被引导时从0开始,每增加一个进程就加1位,直到系统确定的一个数字,例如65564。然后,PID号再从0开始,周而复始,不断循环。通常PID号较小的进程是系统的核心和守护进程,当系统被引导时它们就存在,并只要系统还在运行,它们就处于活跃状态。当用户管理进程时(比如终止它们),就必须要用到PID号。

ps命令输出的TTY列告诉用户进程从哪一个终端开始。如果作为普通用户登录,那么通常就是用户自己的终端或控制台。如果在一个多控制台的系统上工作,用户将看到自己在每一个控制台起动的所有进程。

ps命令输出的STAT列告诉用户当前进程的状态。进程最常见的两种状态是S(sleeping)代表沉睡的进程和R(running)代表运行的进程。运行的进程是当前正在CPU中执行的进程,而沉睡的进程是当前并不活动的进程。进程可以每秒种在沉睡和运行两种状态间转换多次。

ps命令输出的TIME列告诉用户进程占用CPU的总共时间,这些时间通常都很短,这是因为大多数进程运行结束只需很短的时间就够了。

最后,我们来看看COMMANDS这一列,这一列包含了用户所运行的所有命令的名称。出现在COMMANDS列中的通常都是用户使用的命令,但有些命令还会引起其它的进程,这些进程被称为子进程。

login shell

login shell指的是用户登录Linux时所得到的第一个shell,是用户默认的命令行环境。当然,用户在进入系统之后可以从默认的shell(一般是bash)转到其他的shell,如ksh。一般来说,login shell在它的名字前有一个连字符“-”(就像前面例子中的-bash),使用户能把它和以后起动的各种shell区分开来。当使用ps命令查看进程时,出现在输出中的任何其它的shell,在其名字前都不会有连字符“-”。请看下面这个例子:

 $ ps

PID TTY STAT TIME COMMAND

46 v01 S 0:01 -bash

75 v01 S 0:00 pdksh

96 v01 R 0:00 bash

123 v01 R 0:00 ps

从这个例子可以看出,用户的启始shell是bash(PID 46),并且他后来又启动了Korn shell(pdksh,PID 75)和另外一个Bourne shell(bash,PID 96)。您也许注意到了,ps命令总是会出现在输出中,这是因为当用户在用ps命令查看进程时,ps命令还在运行。

对超级用户

当普通用户使用ps命令时,他们只能看到自己的进程。当超级用户(通常是root,但可以改变这个名字)登录时,将看到系统中所有的进程。因此,ps命令会产生很长的输出,特别是当系统中有多个用户时。为了解决这个问题,可以使用管道把ps的输出送给分页过滤命令more或less,或者把ps命令的输出送到一个文件中去以备事后检查。下面是这两种方法的命令格式。

# ps | more

# ps > /tmp/ps_file

有用的ps选项

一个有用的检查用户进程的ps选项是-u,使用选项-u将在原有的输出结果中增加几列新的信息。作为普通用户(不是root)使用该选项会得到类似下例的输出:

 $ ps -u

USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND

Bill 41 0.1 6.8 364 472 v01 S 23:19 0:01 –bash

bill 138 0.0 3.3 72 228 v01 R 23:34 0:00 ps –u

在新增的这几列中,最重要的是USER这一列,它显示谁起动和拥有进程。显示在USER列中的是用户的登录名,就象您在/etc/passwd中看到的一样。ps命令的确查看了/etc/passwd文件,通过用户ID号和组ID号来确定正确的用户姓名。

该选项还增加了%CPU这一列,该列显示的是截止目前进程所用的时间占CPU时间的百分比。而%MEM这一列显示的是当前进程占用内存的百分比。这些数字有助于您找出占用过多的CPU或内存。如果您发现一个进程占用了很多系统资源,那就有必要检查以确认该进程是否是有效进程,免得它继续消耗您有限的系统资源。

当作为root登录使用ps –u时,将看到系统中正在运行的所有进程。和刚才一样,应该使用分页命令使得输出易读。对于有一些Linux版本的ps命令,可以在选项-u后面再跟上用户名。例如,当超级用户root想看用户chen的进程时,可以使用下面的命令:

# ps –u chen

这种命令格式属于系统Ⅴ的ps版本,而不是BSD-based和大多数Linux(包括Red Hat)的ps命令格式。您可以在FTP或 BBS站点获得其它版本的ps命令。普通用户同样可以使使用这条命令来检查其它用户的进程,以检查是谁占用了大多数的CPU时间。这也使得管理员在用户申报问题时直接就可查看该用户的进程,而不用在成百上千条进程中苦苦搜寻。

用户还可以通过选项-a来查看系统中的其它进程(不仅仅是由他们启动的进程)。虽然超级用户使用-a选项是合法的,但他们本来就有查看系统中所有进程的权力,因此不需要使用选项-a。当普通用户使用ps –a命令时,会得到类似下例的输出:

 $ ps -a

PID TTY STAT TIME COMMAND

1 psf S 0:00 init

6 psf S 0:00 update (sync)

23 psf S 0:00 /usr/sbin/crond -l10

29 psf S 0:00 /usr/sbin/syslogd

31 psf S 0:00 /usr/sbin/klogd

33 psf S 0:00 /usr/sbin/lpd

40 psf S 0:00 selection -t ms

42 v02 S 0:01 -bash

43 v03 S 0:00 /sbin/agetty 38400 tty3

44 v04 S 0:00 /sbin/agetty 38400 tty4

45 v05 S 0:00 /sbin/agetty 38400 tty5

46 v06 S 0:00 /sbin/agetty 38400 tty6

41 v01 S 0:01 –bash

140 v01 R 0:00 ps –a

这只是一个小系统相对短小的输出,其中大部分是系统核心进程和守护进程,只有最后两条是使用该命令的用户启动的。当然,从这个结果是不能判断是谁启动了这些进程,所一您可以把选项-u和-a合起来使用(请注意,在这种情况下只使用一个连字符“-”):

 $ ps -au

USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND

root 64 0.0 1.5 41 224 v02 S 22:25 0:00 /sbin/agetty 38400 tty2

root 65 0.0 1.5 41 224 v03 S 22:25 0:00 /sbin/agetty 38400 tty3

root 66 0.0 1.5 41 224 v04 S 22:25 0:00 /sbin/agetty 38400 tty4

root 67 0.0 1.5 41 224 v05 S 22:25 0:00 /sbin/agetty 38400 tty5

root 68 0.0 1.5 41 224 v06 S 22:25 0:00 /sbin/agetty 38400 tty6

root 69 0.0 1.5 56 228 s00 S 22:25 0:00 gpm -t mman

root 71 0.3 3.6 388 532 pp0 S 22:26 0:02 -bash

root 155 0.0 1.5 77 220 pp0 R 22:37 0:00 ps -au

tparker 119 0.4 3.5 372 520 v01 S 22:32 0:01 -bash

tparker 132 0.1 2.2 189 324 v01 S 22:33 0:00 vi test

-au选项产生一个和-u选项相同的列表,但是却能显示系统中所有的进程。用户输入选项的顺序并不会影响输出结果,因此-au和-ua的功能是一样的。如果要增加几个选项,知道这一点就很便捷了。

一些ps的命令行参数只是偶而有用,-l选项可以告诉您某条进程是由哪一条进程引起的,这只有当想鉴别子进程时才有用:

 $ ps -l

F UID PID PPID PRI NI SIZE RSS WCHAN STAT TTY TIME COMMAND

0 501 41 1 15 0 364 472 114d9c S v01 0:00 –bash

0 501 121 41 29 0 64 208 0 R v01 0:00 ps –l

PPID(Parent Process ID)是进程的父进程的ID号。在本例中,列出的第一个进程(PID 41)是第二个进程(PID 121)的父进程。您还可以看到,ps –l的父进程login Bourne shell的PID是1,这是操作系统的init进程。如果init被终止,那么所有的进程都会被杀死。简单地说,如果init死了,系统将关机。

值得一提的是,Linux版本的ps命令有一些自有的特性。它对在选项前面的连字符“-”要求并不严格,所以ps u和ps –u同样可以工作。然而,因为UNIX协定(和大多数UNIX版本)需要连字符,用户必须使用它们。

关于系统管理员

对于大多数系统管理员,通过使用三种ps命令来获得整个系统的信息。下面这三条命令可以获得关于进程的几乎所有信息:

# ps –ax

# ps –aux

# ps –le

为了获得关于ps的精确和完整的信息,请看ps的man page。

kill命令

有时,用户想要或是需要终止一个进程。要终止一个进程的原因可能是:

■ 该进程使用CPU时间过多。

■ 该进程运行了很长时间,而没有产生期望的输出。

■ 该进程产生到屏幕或文件中的输出太多。

■ 该进程似乎锁住了一个终端或其它的会话过程。

■ 由于操作或编程的错误,该进程正在使用错误的输入和输出文件。

■ 该进程没用了。

如果将被终止的是一个后台进程,那么就使用kill命令去杀死这个进程。 要终止一个不在后台的命令,按Ctrl+c就可以终止该进程。但是,当命令不在后台时,按Ctrl+c不能使之终止。这是因为后台进程不在终端控制下,所以任何键盘输入都被忽略。终止后台进程的唯一方法是使用kill命令。

为了使用kill命令,必须有一个可使用的终端或控制台使您能输入kill命令。如果用户的终端被完全锁死了,你就不得不找另外一个能登录系统的用户。作为一个普通用户,他只能kill自己的进程,但是超级用户可以用kill命令杀死系统中的任何进程。

在使用kill命令之前,需要得到要被杀死的进程的ID号。用户可以用ps命令获得进程的ID号。然后,用进程的ID号作为kill的参数。例如,下面的进程是由用户lin启动的,进程名是bad_prog现在已被死锁,需要将它终止。在本例中,我们只是截取了ps命令输出的一段:

 $ ps -u

USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND

lin 561 0.1 6.8 364 472 v01 S 13:19 0:01 -bash

lin 598 9.3 4.1 2736 472 v01 R 15:26 2:01 bad_prog

 $ kill 598

当使用kill命令时,即使工作按期完成了,用户也得不到任何回馈信息。能确定一个进程被终止的唯一方法是再使用ps命令来查看该进程的PID号或进程名是否依然存在。

杀死子进程

因为很多进程都会产生不同ID号的子进程,所以当用户要终止一个进程时,还必须终止其所有的子进程。当一个父进程产生子进程时,最好观察该进程几分钟,以确保所有的子进程都正常工作。要终止进程时,应该使用ps –l命令以便您能检查哪一个是父进程并终止它。

当您是root用户时,如果要终止一个进程,必须确保输入了正确的PID号,否则可能会终止其它有用的进程。此外,仔细检查PID号,以免误删除系统的进程,除非您知道它们为什么需要被终止。

如果用kill命令不能终止一个进程,就需要使用更有效的kill命令。Kill命令通常有几种不同等级的操作。不带任何选项的kill PID将关闭打开的文件,一般来说,它对进程比较“温柔”。如果这样做不起作用,在使用 kill命令时带上选项-9,它将无条件的撤消一个进程。例如要撤消的进程的PID是726,就可以用下面的命令:

# kill –9 726

如果这样做还不起作用,那么这个进程就是不可被终止的,虽然这种情况在Linux系统中不常发生。那么唯一的解决方法是关机并重新启动机器。

Kill –9的缺点是不允许在终止进程之前让它完成它正在做的工作。如果把kill –9用于一个正在更新文件的程序上,那么用户可能丢失更新的材料或整个文件。在多数情况下,不需要-9选项,不带参数的kill命令就可以终止大多数的进程。

终止后台进程

要撤消所有的后台作业,输入kill 0。在后台运行的命令有时启动多个进程,跟踪并找到所有与您要终止的子进程是很乏味的。因为kill 0命令终止当前shell启动的进程,它是较快而简便的方法。输入jobs命令来查看有什么命令在后台执行。例如,如果用户后台执行了命令netscape&,这时可以使用jobs命令来查看:

# jobs

[1]- Running netscape

kill权限

为了防止一个用户终止另一个用户的进程,ps命令将检查核对每个进程的主人。如果有越权行为,将会看到:

kill: - Not owner

当然对超级用户来说是不会看到这条信息的,因为他们有终止任何进程的权力。

小结

本章给出了管理进程所需要的命令。告诉您如何获得进程表,如何在需要时终止一个进程。用户可能不会经常用到这些知识,毕竟系统失去控制,需要您来控制的情况很少见。使用进程命令使用户不用重新引导系统就可更正错误。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有