veket官方网站论坛

veket

 找回密码
 要注册
搜索
查看: 5003|回复: 8

linux进程管理

[复制链接]
发表于 2010-4-24 15:32 | 显示全部楼层 |阅读模式
 Linux是一个多用户多工的操作系统。多用户是指多个用户可以在同一时间使用电脑系统;多工是指Linux可以同时执行多个任务,它可以在还未执行完一个任务时又执行另一项任务。
  操作系统管理多个用户的请求和多个任务。大多数系统都只有一个CPU和一个主存,但一个系统可能有多个二级存储磁盘和多个输入/输出设备。操作系统管理这些资源并在多个用户间共用资源,当你提出一个请求时,给你造成一种假象,好像系统只被你独自占用。而实际上操作系统监控着一个等待执行的任务队列,这些任务包括用户作业、操作系统任务、邮件和显示作业等。操作系统根据每个任务的优先顺序为每个任务分配合适的时间片段,每个时间片段大约都有零点几秒,虽然看起来很短,但实际上已经足够电脑完成成千上万的命令。每个任务都会被系统运行一段时间,然后挂起,系统转而处理其他任务;过一段时间以后再回来处理这个任务,直到某个任务完成,从任务队列中去除。
 楼主| 发表于 2010-4-24 15:32 | 显示全部楼层

进程及作业

  Linux系统上所有运行的任务都可以称之为一个进程,每个用户任务、每个系统管理守护进程,也都可以称之为进程。Linux用分时管理方法使所有的任务共同分享系统资源。我们所关心的是如何去控制这些进程,让它们能够很好地为用户服务。
  进程的一个比较正式的定义是:在自身的虚拟地址空间运行的一个单独的程序。进程与程序是有区别的,进程不是程序,虽然它由程序产生。程序只是一个静态的命令集合,不占系统的运行资源;而进程是一个随时都可能发生变化的、动态的、使用系统运行资源的程序。而且一个程序可以启动多个进程。

  Linux系统中所有进程都是相互联系的。除了初始化进程外,所有进程都有一个父进程。新进程不是被创建,而是被复制,或者从以前的进程复制而来。 Linux系统中所有的进程都是由一个进程号为1的init进程衍生而来的。而我们在Shell下执行程序启动的进程则是Shell进程的子进程,当然我们启动的进程可以再启动自己的子进程。这样形成了一棵进程树,每个进程都是树中的一个节点,其中树的根是init。

  进程和作业的概念也有区别。一个正在执行的进程称为一个作业,而作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令的时候。

  作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个进程,等一会儿再继续执行该进程。Shell将记录所有启动的进程情况,在每个进程过程中,用户可以任意地挂起进程或重新启动进程。作业控制是许多Shell(包括bash和tcsh)的一个特性,使用户能在多个独立作业间进行切换。

  例如,当用户编辑一个文字文件,并需要中止做其他事情时,利用作业控制,用户可以让编辑器暂时挂起,返回Shell提示符开始做其他的事情。其他事情做完以后,用户可以重新启动挂起的编辑器,返回到刚才中止的地方,就像用户从来没有离开编辑器一样。这只是一个例子,作业控制还有许多其他实际的用途。
 楼主| 发表于 2010-4-24 15:33 | 显示全部楼层

创建进程

  在Shell环境下键入需要运行的程序或在图形界面下执行一个程序,其实也就是启动了一个进程。在Linux系统中每个进程都具有一个进程号,用于系统识别和调度。启动一个进程有两个主要途径。手工启动和调度启动,后者是事先进行设置,根据用户要求自行启动。

  手工启动

  由用户输入命令,直接启动一个进程便是手工启动。但手工启动进程又可以分为前台启动和后台启动。

  前台启动是手工启动一个进程的最常用的方式。一般用户键入一个命令“ls –l”,这就已经启动了一个进程,而且是一个前台的进程。这时候系统其实已经处于一个多进程状态。或许有些用户会疑惑:我只启动了一个进程而已。但实际上有许多运行在后台的、系统启动时就已经自动启动的进程正在悄悄运行着。还有的用户在键入“ls –l”命令以后赶紧使用“ps –x”查看,却没有看到ls进程,也觉得很奇怪。其实这是因为ls这个进程结束太快,使用ps查看时该进程已经执行结束了。

  直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗时,且用户也不急着需要结果的时候。假设用户要启动一个需要长时间运行的格式化文字文件的进程。为了不使整个Shell在格式化过程中都处于“瘫痪”状态,从后台启动这个进程是明智的选择。

  调度启动

  有时候需要对系统进行一些比较费时而且占用资源的维护工作,这些工作适合在深夜进行,这时候用户就可以事先进行调度安排,指定任务运行的时间或者场合,到时候系统会自动完成这些工作。要使用自动启动进程的功能,就需要掌握以下几个启动命令。

  1.at命令

  用户使用at命令在指定时刻执行指定的命令序列。也就是说,该命令至少需要指定一个命令、一个执行时间才可以正常运行。at命令可以只指定时间,也可以时间和日期一起指定。需要注意的是,指定时间有个系统判别问题。比如说,用户现在指定了一个执行时间——凌晨3:20,而发出at命令的时间是头天晚上的20:00,那么究竟是在哪一天执行该命令呢?如果用户在3:20以前仍然在工作,那么该命令将在这个时候完成;如果用户3:20以前就退出了工作状态,那么该命令将在第二天凌晨才得到执行。下面是at命令的语法格式:

  at [-V] [-q 队列] [-f 文件名] [-mldbv] 时间

  at -c 作业 [作业...]

  at允许使用一套相当复杂的指定时间的方法,它可以接受在当天的 hh:mm(小时:分钟)式的时间指定。如果该时间已经过去,那么就放在第二天执行。当然也可以使用 midnight(深夜)、noon(中午)、teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。用户还可以采用12小时计时制,即在时间后面加上AM (上午)或者PM (下午)来说明是上午还是下午。也可以指定命令执行的具体日期,指定格式为month day(月日)、mm/dd/yy(月/日/年)或者 dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。

  上面介绍的都是绝对计时法,其实还可以使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:now + count time-units ,now就是当前时间,time-units是时间单位,这里可以是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。 count是时间的数量,究竟是几天,还是几小时。

  还有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。下面通过一些例子来说明具体用法。

  比如,指定在今天下午 5:30 执行某命令。假设现在时间是2001年2月24日中午12:30,其命令格式如下:

  at 5:30pm

  at 17:30

  at 17:30 today

  at now + 5 hours

  at now + 300 minutes

  at 17:30 24.2.99

  at 17:30 2/24/99

  at 17:30 Feb 24

  以上这些命令表达的意义是完全一样的,所以在安排时间的时候完全可以根据个人喜好和具体情况自由选择。一般采用绝对时间的24小时计时法可以避免由于用户自己的疏忽造成计时错误的情况发生,例如上例可以写成 ∶

  at 17:30 2/24/99

  这样非常清楚,而且别人也看得懂。

  对于at命令来说,需要定时执行的命令是从标准输入或者使用-f选项指定的文件中读取并执行的。如果at命令是从一个使用su命令切换到用户 Shell中执行的,那么当前用户被认为是执行用户,所有的错误和输出结果都会送给这个用户。但是如果有邮件送出的话,收到邮件的将是原来的用户,也就是登录时Shell的所有者。

  在任何情况下,超级用户都可以使用这个命令。对于其他用户来说,是否可以使用取决于两个文件:/etc/at.allow和/etc/at.deny 。
 楼主| 发表于 2010-4-24 15:34 | 显示全部楼层
  2.cron命令

  前面介绍的两条命令都会在一定时间内完成一定任务,但是要注意它们都只能执行一次。也就是说,当指定了运行命令后,系统在指定时间完成任务,一切就结束了。但是在很多时候需要不断重复一些命令,比如某公司每周一自动向员工报告头一周公司的活动情况,这时候就需要使用cron命令来完成任务了。实际上,cron命令是不应该手工启动的。cron命令在系统启动时就由一个Shell脚本自动启动,进入后台(所以不需要使用&符号)。一般的用户没有运行该命令的许可权,虽然超级用户可以人工启动cron,不过还是建议将其放到Shell脚本中由系统自行启动。

  首先cron命令会搜索/var/spool/cron目录,寻找以/etc/passwd文件中的用户名命名的crontab文件,被找到的这种文件将载入内存。例如一个名为foxy的用户,它所对应的crontab文件就应该是/var/spool/cron/foxy。也就是说,以该用户命名的crontab文件存放在/var/spool/cron目录下面。cron命令还将搜索/etc/crontab文件,这个文件是用不同的格式写成的。cron启动以后,它将首先检查是否有用户设置了crontab文件,如果没有就转入“休眠”状态,释放系统资源。所以该后台进程占用资源极少。它每分钟“醒”过来一次,查看当前是否有需要运行的命令。命令执行结束后,任何输出都将作为邮件发送给crontab的所有者,或者是/etc /crontab文件中MAILTO环境变量中指定的用户。上面简单介绍了一些cron的工作原理,但是cron命令的执行不需要用户干涉;需要用户修改的是crontab中要执行的命令序列,所以下面介绍crontab命令。

  3.crontab命令

  crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。也就是说,用户把需要执行的命令序列放到crontab文件中执行。每个用户都可以有自己的crontab文件。下面就来看看如何创建一个crontab文件。在/var/spool/cron下的crontab文件不可以直接创建或者直接修改。crontab文件是通过crontab命令得到的。现在假设有个用户名为foxy,需要创建自己的一个crontab文件。首先可以使用任何文本编辑器创建一个新文件,然后向其中写入需要运行的命令和要定期执行的时间。然后保存文件退出。假设该文件为/tmp /test.cron。然后就使用crontab命令来安装这个文件,使之成为该用户的crontab文件。

  crontab test.cron

  这样一个crontab 文件就创建好了。可以转到/var/spool/cron目录下面查看,发现多了一个foxy文件。这个文件就是所需的crontab文件。

  在crontab文件中如何输入需要执行的命令和时间呢?该文件中每行都包括6个域,其中前5个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者跳位字符分隔。格式如下:

  minute hour day-of-month month-of-year day-of-week commands

  第1项是分钟,第2项是小时,第3项是一个月的第几天,第4项是一年的第几个月,第5项是一周的星期几,第6项是要执行的命令。这些项都不能为空,必须填入。如果用户不需要指定其中的几项,那么可以使用*代替。因为*是万用字符,可以代替任何字符,所以就可以认为是任何时间,也就是该项被忽略了。

  进程的挂起及恢复

  作业控制允许将进程挂起并可以在需要时恢复进程的运行,被挂起的作业恢复后将从中止处开始继续运行。只要在键盘上按【Ctrl+Z】,即可挂起当前的前台作业。在键盘上按【Ctrl+Z】后,将挂起当前执行的命令cat。使用jobs命令可以显示 Shell的作业清单,包括具体的作业、作业号以及作业当前所处的状态。恢复进程执行时,有两种选择:用fg命令将挂起的作业放回到前台执行;用bg命令将挂起的作业放到后台执行。灵活使用上述命令,将给自己带来很大的方便。
 楼主| 发表于 2010-4-24 15:34 | 显示全部楼层

进程管理

  由于Linux是个多用户系统,有时候也要了解其他用户现在在干什么;同时Linux是一个多进程系统,经常需要对这些进程进行一些调配和管理;而要进行管理,首先就要知道现在的进程情况:究竟有哪些进程?进程情况如何?所以需要查看进程。

  1.who命令

  该命令主要用于查看当前线上的用户情况。这个命令非常有用。如果用户想和其他用户创建即时通信,比如使用talk命令,那么首先要确定的就是该用户确实上线,不然talk进程就无法创建起来。又如,系统管理员希望监视每个登录的用户此时此刻的行为,也要使用who命令。who命令应用起来非常简单,可以比较准确地掌握用户的情况,所以使用非常广泛。

  2.w命令

  该命令也用于显示登录到系统的用户情况,但是与who不同的是,w命令功能更加强大,它不但可以显示有谁登录到系统,还可以显示出这些用户当前正在进行的工作,并且统计资料相对who命令来说更加详细和科学。可以认为w命令就是who命令的一个增强版。w命令的显示项目按以下顺序排列:当前时间;系统启动到现在的时间;登录用户的数目;系统在最近1秒、5秒和15秒的平均负载。然后是每个用户的各项资料,项目显示顺序如下:登录账号、终端名称、远程主机名、登录时间、空闲时间、JCPU、PCPU、当前正在运行进程的命令行。其中JCPU时间指的是和该终端(tty)连接的所有进程占用的时间。这个时间里并不包括过去的后台作业时间,但却包括当前正在运行的后台作业所占用的时间。而PCPU时间则是指当前进程(即在WHAT项中显示的进程)所占用的时间。

  3.ps命令

  ps命令就是最基本的同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行以及运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都可以通过执行该命令得到。

  ps命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要检测其情况,便可以使用ps命令了。

  ps [选项]

  下面对命令选项进行说明 ∶

  -e 显示所有进程。

  -f 全格式。

  -h 不显示标题。

  -l 长格式。

  -w 宽输出。

  a 显示终端上的所有进程,包括其他用户的进程。

  r 只显示正在运行的进程。

  x 显示没有控制终端的进程。

  O[+|-] k1 [, [+|-] k2 [, …]] 根据SHORT KEYS, k1, k2中快捷键指定的多级排序顺序显示进程列表。对于ps的不同格式都存在着默认的顺序指定。这些默认顺序可以被用户的指定所覆盖。其中 + 字符是可选的,- 字符是倒转指定键的方向。

  最常用的3个参数是u, a, x。

  下面是命令

   #ps axu

  的输出格式:

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

  USER:进程所有者。

  PID:进程号。

  %CPU:占用的 CPU 使用率。

  %MEM:占用的内存使用率。

  VSZ:占用的虚拟内存大小。

  RSS:占用的内存大小。

  TTY:终端的次设备号码。

  STAT:该进程的状态。

  D:不可中断的休眠(通常表示该进程正在进行I/O动作)。

  R:正在执行中。

  S:休眠状态。

  T:暂停执行。

  Z:不存在但暂时无法消除。

  W:没有足够的内存分页可分配。

  <:高优先顺序的进程。

  N:低优先顺序的进程。

  L:有内存分页分配并锁在内存内(即时系统或定制I/O)。

  START:进程开始时间。

  TIME:执行的时间。

  COMMAND:所执行的命令

  例:

  #ps

  PID TTY TIME CMD

  2791 ttyp0 00:00:00 tcsh

  3092 ttyp0 00:00:00 ps

  #ps -A

  PID TTY TIME CMD

  1 ? 00:00:03 init

  2 ? 00:00:00 kflushd

  3 ? 00:00:00 kpiod

  4 ? 00:00:00 kswapd

  5 ? 00:00:00 mdrecoveryd

  .......

  # ps -aux

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

  root 1 0.0 0.7 1096 472 ? S Sep10 0:03 init [3]

  root 2 0.0 0.0 0 0 ? SW Sep10 0:00 [kflushd]

  root 3 0.0 0.0 0 0 ? SW Sep10 0:00 [kpiod]

  root 4 0.0 0.0 0 0 ? SW Sep10 0:00 [kswapd]
您需要登录后才可以回帖 登录 | 要注册

本版积分规则

QQ|手机版|Archiver|veket官方网站论坛 ( 粤ICP备 11052856 )

GMT+8, 2025-5-1 23:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表