进程管理 编辑 请登陆,再编辑

前言

在Linux系统上运行的任何东西,每一个用户的工作、每一个系统监控程序等等都是以进程的形式运行的。我们不关心这些进程究竟是如何分配的,或者是内核如何管理分配时间片的,所关心的是如何去控制这些进程,让它们能够很好地为用户服务。

因此进程管理是Linux系统管理非常重要的一个方面。

进程管理

图形管理

我们可以使用深度操作系统自带的系统监视器方便的管理进程.

命令管理

查看进程

Ps

显示瞬间进程 (process) 的动态

    语法:ps [options] [--help]

    参数:
    ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义
    -A 列出所有的进程
    -w 显示加宽可以显示较多的资讯
    -au 显示较详细的资讯
    -aux 显示所有包含其他使用者的进程

Pstree

将所有进程以树状图显示, 树状图将会以 pid (如果有指定) 或是以 init 这个基本进程为根 (root) ,如果有指定使用者 id , 则树状图会只显示该使用者所拥有的进程。

    使用方式:pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-G|-U] [pid|user]
     pstree -V

    参数:
    -a 显示该进程的完整指令及参数, 如果是被记忆体置换出去的进程则会加上括号。
    -c 如果有重覆的进程名, 则分开列出 (预设值是会在前面加上 *)。

Top

实时显示 process 的动态 点此进入TOP页面

    语法:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

    主要参数:
    d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
    q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
    c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S : 累积模式,会将己完成或
    消失的子进程 ( dead child process ) 的 CPU time 累积起来
    s : 安全模式,将交谈式指令取消, 避免潜在的危机
    i : 不显示任何闲置 (idle) 或无用 (zombie) 的进程
    n : 更新的次数,完成后将会退出 top
    b : 批次档模式,搭配 "n" 参数一起使用,可以用来将 top 的结果输出到档案内

杀死进程[编辑]

Kill

杀死执行中的程序或工作。kill可将指定的信息送至程序,预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或jobs指令查看。

kill的经常和ps 或pgrep 命令结合在一起使用的

    语法:kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]

    主要参数:
    -l <信息编号>  若不加<信息编号>选项,则-l参数会列出全部的信息名称。
    -s <信息名称或编号>  指定要送出的信息。

注:信号代码可以省略;我们常用的信号代码是 -9 ,表示强制终止;

举例:

    ps auxf |grep httpd
    root 4939 0.0 0.0 5160 708 pts/3 S+ 13:10 0:00 \_ grep httpd
    root 4830 0.1 1.3 24232 10272 ? Ss 13:02 0:00 /usr/sbin/httpd
    apache 4833 0.0 0.6 24364 4932 ? S 13:02 0:00 \_ /usr/sbin/httpd
    apache 4834 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd
    apache 4835 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd
    apache 4836 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd
    apache 4840 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd

我们查看httpd 服务器的进程;您也可以用pgrep -l httpd 来查看;

我们看上面例子中的第二列,就是进程PID的列,其中4830是httpd服务器的父进程,从4833-4840的进程都是它4830的子进程;如果我们杀掉父进程4830的话,其下的子进程也会跟着死掉;

    kill 4840 注:杀掉4840这个进程;
    ps -auxf |grep httpd 注:查看一下会有什么结果?是不是httpd服务器仍在运行?
    kill 4830 注:杀掉httpd的父进程;
    ps -aux |grep httpd 注:查看httpd的其它子进程是否存在,httpd服务器是否仍在运行?

对于僵尸进程,可以用kill -9 来强制终止退出;

比如一个程序已经彻底死掉,如果kill 不加信号强度是没有办法退出,最好的办法就是加信号强度 -9 ,后面要接杀父进程;比如;

    ps aux |grep gaim
    beinan 5031 9.0 2.3 104996 17484 ? S 13:23 0:01 gaim
    root 5036 0.0 0.0 5160 724 pts/3 S+ 13:24 0:00 grep gaim
    pgrep -l gaim
    5031 gaim
    kill -9 5031

kill命令的工作原理

向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操作。

例如在top命令中,我们看到系统运行许多进程,有时就需要使用kill中止某些进程来提高系统资源。在讲解安装和登陆命令时,曾提到系统多个虚拟控制台的作用是当一个程序出错造成系统死锁时,可以切换到其它虚拟控制台工作关闭这个程序。此时使用的命令就是kill,因为kill是大多数Shell内部命令可以直接调用的。

killall

killall 发送一条信号给所有运行任意指定命令的进程. 如果没有指定信号名, 则发送 SIGTERM.

信号可以以名字 (如 -HUP ) 或者数字 (如 -1 ) 的方式指定. 信号 0 (检查进程是否存在)只能以数字方式指定.

如果命令名包括斜杠 (/), 那么执行该特定文件的进程将被杀掉, 这与进程名无关.

如果对于所列命令无进程可杀, 那么 killall 会返回非零值. 如果对于每条命令至少杀死了一个进程, killall 返回 0.

killall 进程决不会杀死自己 (但是可以杀死其它 killall 进程).

killall 也和ps或pgrep 结合使用,比较方便;通过ps或pgrep 来查看哪些程序在运行

    语法:
    killall [-egiqvw] [-signal] name ... 
    killall -l 
    killall -V 

    选项:
    -e对于很长的名字, 要求准确匹配. 如果一个命令名长于 15 个字符, 则可能不能用整个名字 (溢出了). 在这种情况下, killall 会杀死所有匹配名字前 15 个字符的所有进        程. 有了 -e 选项,这样的记录将忽略. 如果同时指定了 -v 选项, killall 会针对每个忽略的记录打印一条消息.
    -g杀死属于该进程组的进程. kill 信号给每个组只发送一次, 即使同一进程组中包含多个进程.
    -i交互方式,在杀死进程之前征求确认信息.
    -l列出所有已知的信号名.
    -q如果没有进程杀死, 不会提出抱怨.
    -v报告信号是否成功发送.
    -V显示版本信息.
    -w等待所有杀的进程死去. 

举例:

    pgrep -l gaim
    2979 gaim
    killall gaim

pkill

pkill 和killall 应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill 来杀掉。 pkill也可以杀死指定用户的所有进程,当然这么操作也会将该用户踢下线 应用方法

pkill 正在运行的程序名

举例:

    pgrep -l gaim
    2979 gaim
    pkill gaim

pkill 登陆的用户

pkill linux ##将linux用户所有进程杀死,并且将其踢下线

xkill

杀死桌面图形界面的程序。

应用情形实例:firefox出现崩溃不能退出时,点鼠标就能杀死firefox 。

终端执行:

     xkill

当xkill运行时出来和个人脑骨的图标,哪个图形程序崩溃一点就OK了。 如果您想终止xkill ,就按右键取消;

进程调节

Nice

以更改过的优先序来执进程序, 如果未指定程序, 则会显示出目前的排程优先序, 内定的 adjustment 为 10, 范围为 -20 (最高优先序) 到 19 (最低优先序)

    语法:nice [-n adjustment] [-adjustment] [--adjustment=adjustment] [--help] [--version] [command [arg...]

    主要参数:
    -n adjustment, -adjustment, --adjustment=adjustment 皆为将该原有优先序的增加 adjustment
    --help 显示求助讯息
    --version 显示版本资讯

范例: 将 ls 的优先序加 1 并执行 : nice -n 1 ls 注意 : 优先序 (priority) 为操作系统用来决定 CPU 分配的参数,Linux 使用『回合制(round-robin)』的演算法来做 CPU 排程,优先序越高,所可能获得的 CPU时间就越多。

定时任务

Crontab

定期时间内执行Linux程序(crontab)

是用来让使用者在固定时间或固定间隔执进程序之用,换句话说,也就是类似使用者的时程表。

    语法:
    crontab [ -u user ] file
    crontab [ -u user ] { -l | -r | -e }

    -u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

    主要参数:
    -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv         VISUAL joe)
    -r : 删除目前的时程表
    -l : 列出目前的时程表

时程表的格式如下:

    f1 f2 f3 f4 f5 program
    其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
    当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执进程序,其馀类推
    当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
    当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
    当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推。

说明:使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。

第一:启动crond服务:

     service crond start|stop|restart|reload

第二:编辑iptables文件

     crontab /root/desktop/iptables.cron

第三:创建crontab

     crontab crontabfile
    或 crontab -e

例子1:每月每天每小时的第 0 分钟执行一次 /bin/ls :

     0 * * * * /bin/ls

例子2:在 12 月内, 每天的早上 6 点到 12 点中,每隔 20 分钟执行一次 /usr/bin/backup :

     0 6-12/3 * 12 * /usr/bin/backup

注意 :当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可 。

At

at 可以让使用者指定在 TIME 这个特定时刻执行某个程序或指令,TIME 的格式是 HH:MM其中的 HH 为小时,MM 为分钟,甚至你也可以指定 am, pm, midnight, noon,。

使用者也可指定 today 或 tomorrow 来表示今天或明天。当指定了时间并按下 enter 之后,at 会进入交谈模式并要求输入指令或程序,当你输入完后按下 ctrl+D 即可完成所有动作,至于执行的结果将会寄回你的帐号中。

    语法:
     at -V [-q queue] [-f file] [-mldbv] TIME

    参数:
    -V : 印出版本编号
    -q : 使用指定的储列(Queue)来储存,at 的资料是存放在所谓的 queue 中,使用者可以同时使用多个 queue,而 queue 的编号为 a, b, c... z 以及 A, B, ... Z 共 52 个
    -m : 即使程序/指令执行完成后没有输出结果, 也要寄封信给使用者
    -f file : 读入预先写好的命令档。使用者不一定要使用交谈模式来输入,可以先将所有的指定先写入档案后再一次读入
    -l : 列出所有的指定 (使用者也可以直接使用 atq 而不用 at -l)
    -d : 删除指定 (使用者也可以直接使用 atrm 而不用 at -d)
    -v : 列出所有已经完成但尚未删除的指定

例子1: 三天后的下午 5 点钟执行 /bin/ls :

     at 5pm +3 days /bin/ls

例子2: 三个星期后的下午 5 点钟执行 /bin/ls :

     at 5pm +2 weeks /bin/ls

例子3: 明天的 17:20 执行 /bin/date :

     at 17:20 tomorrow /bin/date

例子4: 1999 年的最后一天的最后一分钟印出 the end of world !

     at 23:59 12/31/1999 echo the end of world !

例子5: 在规定时间内执行桌面at.txt文件

     $ at 9:20 4/13/2011
     at> touch /root/desktop/at.txt
     at> <EOT> # 按Ctrl+D实现

相关链接

鸟哥私房菜:程序管理

Linux进程控制

Slackware手册:进程控制

Linux 系统 kill、killall、pkill、xkill