Linux学习笔记(十八)

程序与资源管理

Linux是如何识别程序的?当系统有太多的“死亡的”程序时,怎样将该程序查出来并删除掉?如果主机仅仅允许一次登入一个终端画面,如何进行多项工作?怎样设置一个程序让它执行更快些?这些都是进程控制的重点,如果X_Window“死了”,但Linux还运行,是否需要重新启动呢?是是否有其它方式可以重新启动X_Window?

什么是进程

在Linux系统中:触发任何一个事件,系统都会将它定义成为一个进程,并且给这个进程一个ID,称为PID,同时根据启动整个进程的用户与相关属性关系,给这个PID一组有效地权限设置。这个PID能在系统上进行的动作就与PID权限有关。

进程与程序

如何产生一个进程ID(PID),“执行一个程序或命令”,就可以触发一个事件而获取PID。系统仅仅认识二进制文件,二进制文件就是程序。

当登录并执行bash时,系统已经给我们一个pid,这个PID是根据登录者的UID/GI而得到的。

1 子程序与父程序

登录后会获取一个bash的Shell,利用这个bash提供的接口去执行另一命令,这些另外执行的命令也会被触发成为PID,则这个PID就是“子进程”,而在bash环境下的就称为“父进程”

2 系统或网络服务:常驻内存程序

有无一直执行的程序呢?当然有,比如系统每分钟都会扫描/etc/crontab以及相关的设置文件来进行工作任务分配。工作任务分配时由“cron程序”负责的,后台启动了它并且在一直持续不断的运行,是一个“常驻内存程序”。有很多,比如crond和atd, syslog还有一些事复制网络联机的服务如Apache,named,vsftp等等。这些网络服务程序执行后,会启动一个可以负责网络监听的端口(port),以提供外部客户端的联机功能。

Linux的多用户、多任务环境

多人环境。

多任务行为。

多重登录环境的7个基本终端窗口。

特殊的程序管理行为。

Bash环境下的作业管理。

多用户、多任务的系统资源分配问题。

作业管理:&, [ctrl]-z, jobs, fg, bg, kill

作业管理是在bash环境下使用的。“当我们登录系统获取bash shell之后,在单一终端界面下,同时管理多个作业”

注意:管理作业时,每个作业都是当前bash的子程序,也就是说它们彼此间是有联系的。我们无法以作业管理的方式由tty1去管理tty2的bash。

要进行bash的作业管理,必须注意的限制:

程序必须是Shell的子程序。

程序不能等待terminal/shell的输入。

1 直接将命令放到后台“执行”的&

   前台:你可以控制的作业称为前台作业;

   后台:在内存可以自行运行的作业,您无法直接控制它,除非bg/fg等命令将作业调出来。

将作业放到后台工作 : &

在敲完命令后,在敲回车前 加上&这个字符 然后再点回车 就可以把刚才所的命令放到后台去执行了。 会给出刚才的作业一个 作业号 和PID.然后就回到命令提示符号下 可以继续工作咯。这样做最大的好处不用怕被 “ctrl+c”中断掉。将作业放到后台中,要特别注意数据的流向。如果有stdout和stderr时,数据依然是会输出到屏幕上,这个时候就要使用数据流重导向了。

2 将“前台”作业放到后台“暂停”

利用 “[ctrl]+z”组合键,可以把当前的作业放到后台 暂停执行。

[root@www ~]# vi ~/.bashrc 

在 vi 的一般模式下,按下 [ctrl]-z 这两个按键 

[1]+  Stopped                 vim ~/.bashrc 

[root@www ~]#   <==顺利取得了前景的操控权! 

[root@www ~]# find / -print 

....(输出省略).... 

此时屏幕会非常的忙碌!因为屏幕上会显示所有的文件名。请按下 [ctrl]-z 暂停 

[2]+  Stopped                 find / -print 

在 vi 的一般模式下,按下 [ctrl] 及 这两个按键,屏幕上会出现 [1] ,表示这是第一个工作, 而那个 代表最近一个被丢进背景的工作,且目前在背景下预设会被取用的那个工作 (与 fg 这个指令有关 )!而那个 Stopped 则代表目前这个工作的状态。在预设的情况下,使用 [ctrl]-z 丢到背景当中的工作都是『暂停』的状态!

3 观察当前后台作业状态:jobs

[root@linux ~]# jobs [-lrs]

参数:

-l :除了列出作业号之外,同时列出PID

-r:仅列出正在后台运行(run)的作业

-s:仅列出正在后台暂停(stop)的作业

“+“表示是默认的作业

4 将后台作业拿到前台处理:fg

[root@linux ~]#fg %jobnumber

参数:

Jobnumber:作业的号码,注意“%“是可有可无的。

5 让作业在后台运行:bg

我们刚刚提到,那个 [ctrl]-z 可以将目前的工作丢到背景底下去『暂停』, 那么如何让一个工作在背景底下『 Run 』呢?我们可以在底下这个案例当中来测试! 注意喔!底下的测试要进行的快一点!^_^ 

[root@linux ~]#bg %jobnumber

范例一:一执行 find / -perm +7000 > /tmp/text.txt 后,立刻丢到背景去暂停! 

[root@www ~]# find / -perm +7000 > /tmp/text.txt 

此时,请立刻按下 [ctrl]-z 暂停! 

[3]+  Stopped                 find / -perm +7000 > /tmp/text.txt  

范例二:让该工作在背景下进行,并且观察他!! 

[root@www ~]# jobs ; bg %3 ; jobs 

[1]-  Stopped                 vim ~/.bashrc 

[2]   Stopped                 find / -print 

[3]+  Stopped                 find / -perm +7000 > /tmp/text.txt 

[3]+ find / -perm +7000 > /tmp/text.txt &  <==用 bg%3 癿情冴! 

[1]+  Stopped                 vim ~/.bashrc 

[2]   Stopped                 find / -print 

[3]-  Running                 find / -perm +7000 > /tmp/text.txt & 

6 管理后台作业:kill

kill 这个指令 直接删除作业或者是将该作业重新启动

[root@www ~]# kill -signal %jobnumber

[root@www ~]# kill -l

选项与参数:

-l  :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?

signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:

  -1 :重新读取一次参数的设定档 (类似 reload);

  -2 :代表与由键盘输入 [ctrl]-c 同样的动作;

  -9 :立刻强制删除一个工作;

  -15:以正常的程序方式终止一项工作。与 -9 是不一样的。

 

范例一:找出目前的 bash 环境下的背景工作,并将该工作『强制删除』。

[root@www ~]# jobs

[1]+  Stopped                 vim ~/.bashrc

[2]   Stopped                 find / -print

[root@www ~]# kill -9 %2; jobs

[1]+  Stopped                 vim ~/.bashrc

[2]   Killed                  find / -print

# 再过几秒你再下达 jobs 一次,就会发现 2 号工作不见了!因为被移除了!

 

范例:找出目前的 bash 环境下的背景工作,并将该工作『正常终止』掉。

[root@www ~]# jobs

[1]+  Stopped                 vim ~/.bashrc

[root@www ~]# kill -SIGTERM %1

# -SIGTERM 与 -15 是一样的!您可以使用 kill -l 来查阅!

特别留意一下, -9 这个 signal 通常是用在『强制删除一个不正常的工作』时所使用的, -15 则是以正常步骤结束一项工作(15也是默认值),两者之间并不相同呦!

 

脱机管理问题 

如果不想要使用 at 的话,那你也可以尝试使用 nohup 这个指令来处理喔!这个 nohup 可以让你在脱机或注销系统后,还能够让工作继续进行。他的语法有点像这样: 

[root@www ~]# nohup [指令与参数]   <==在终端机前景中工作 

[root@www ~]# nohup [指令与参数] & <==在终端机背景中工作 

进程管理:

进程管理为什么重要:

首先:我们在操作操作系统时,各项作业其实都是通过某个PID来执行,因为是否执行某项作业,与该进程的权限有关。

其次:如果Linux系统很忙,当整个系统资源块要被用完时,是否能找出最耗费系统资源的进程并删除该进程,让系统恢复正常。

再次:如果某个程序写的不好,导致内存中产生有问题的进程,如何找出它,然后删除?

最后:如果同时在系统中运行5~6项作业,其中有一项作业最重要,如何让它先运行?

 

进程的观察

查看系统上正在运行的进程:静态的ps或动态的top 结合pstree来查看进程树之间的关系。

1 ps

ps :将某个时间点的程序运作情况撷取下来

[root@www ~]# ps aux  <==观察系统所有的程序数据

[root@www ~]# ps -lA  <==也是能够观察所有系统的数据

[root@www ~]# ps axjf <==连同部分程序树状态

选项与参数:

-A  :所有的 process 均显示出来,与 -e 具有同样的效用;

-a  :不与 terminal 有关的所有 process ;

-u  :有效使用者 (effective user) 相关的 process ;

x   :通常与 a 这个参数一起使用,可列出较完整信息。

输出格式规划:

l   :较长、较详细的将该 PID 的的信息列出;

j   :工作的格式 (jobs format)

-f  :做一个更为完整的输出。

不过建议使用下面这个两个就可以了:一个是只能查阅自己 bash 程序的『 ps -l 』,默认情况下ps仅仅列出与当前所在的bash有关的PID。一个则是可以查阅所有系统运作的程序『 ps aux 』!注意,你没看错,是『 ps aux 』没有那个减号 (-)

例子:

仅观察自己的 bash 相关程序: ps -l

范例一:将目前属于您自己这次登入的 PID 与相关信息列示出来(只与自己的 bash 有关)

[root@www ~]# ps -l

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD

4 S     0 13639 13637  0  75   0 -  1287 wait   pts/1    00:00:00 bash

4 R     0 13700 13639  0  77   0 -  1101 -      pts/1    00:00:00 ps

ps列出来的资料都有以下:

F:代表这个程序旗标 (process flags),说明这个程序的总结权限,常见号码有:

若为 4 表示此程序的权限为 root ; 

若为 1 则表示此子程序仅进行复制(fork)而没有实际执行(exec)。 

S:代表这个程序的状态 (STAT),主要的状态有:

R (Running):该程序正在运作中; 

S (Sleep):开程序目前正在睡眠状态(idle),但可以被唤醒(signal)。 

D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印) 

T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态; 

Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。 

UID/PID/PPID:代表『此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号码』

C:代表 CPU 使用率,单位为百分比;

PRI/NI:Priority/Nice 的缩写,代表此程序被 CPU 所执行的优先级,数值越小代表该程序越快被 CPU 执行。详细的 PRI 与 NI 将在下一小节说明。

ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,如果是个 running 的程序,一般就会显示『 - 』 / SZ 代表此程序用掉多少内存 / WCHAN 表示目前程序是否运作中,同样的, 若为 - 表示正在运作中。

TTY:登入者的终端机位置,若为远程登入则使用动态终端接口 (pts/n);

TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运作的时间,而不是系统时间;

CMD:就是 command 的缩写,造成此程序的触发程序之指令为何。

观察系统所有程序: ps aux

范例二:列出目前所有的正在内存当中的程序:

[root@www ~]# ps aux

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

root         1  0.0  0.0   2064   616 ?        Ss   Mar11   0:01 init [5]

root         2  0.0  0.0      0     0 ?        S<   Mar11   0:00 [migration/0]

root         3  0.0  0.0      0     0 ?        SN   Mar11   0:00 [ksoftirqd/0]

.....(中间省略).....

root     13639  0.0  0.2   5148  1508 pts/1    Ss   11:44   0:00 -bash

root     14232  0.0  0.1   4452   876 pts/1    R+   15:52   0:00 ps aux

root     18593  0.0  0.0   2240   476 ?        Ss   Mar14   0:00 /usr/sbin/atd

你会发现 ps -l 与 ps aux 显示的项目并不相同!在 ps aux 显示的项目中,各字段的意义为:

USER:该 process 属于那个使用者账号的? 

PID :该 process 的程序识别码。 

%CPU:该 process 使用掉的 CPU 资源百分比; 

%MEM:该 process 所占用的物理内存百分比; 

VSZ :该 process 使用掉的虚拟内存量 (Kbytes) 

RSS :该 process 占用的固定的内存量 (Kbytes) 

TTY :该 process 是在那个终端机上面运作,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。 

STAT:该程序目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z) 

START:该 process 被触发启动的时间; 

TIME :该 process 实际使用 CPU 运作的时间。 

COMMAND:该程序的实际指令为何?

“僵尸进程”是什么?造成僵尸进程的原因是:该进程应该已执行完毕,或者是因故应该终止,但该进程的父进程却无法完整地结束该进程而造成那个进程一直存在于内存中(程序写的不好或者是用户的操作习惯不良)。

如果某个进程的CMD后面还有,就表示该进程是僵尸进程。

处理方法:找到该僵尸进程的父进程,跟踪,进行主机的优化,改善,不要直接杀死它。

 

2 top 

[root@linux ~]#top [-d] | top [-bnp]

-d:后面可以接秒数,就是整个画面更新的秒数。默认是5秒。

-b:以批处理的方式执行top,还可以有更多参数。通常会搭配数据流重导向,经批处理的结果输出为文件。

-n:与 –b搭配,意义是需要进程几次top的输出结果。

-p:指定某个PID来进行观察。

在top执行过程中可以使用的按键命令:

     ?:显示在top中可以输入的按键命令。

     P:按CPU的使用资源来排列。

     M:按内存(memory)的使用资源来排列。

     N:按PID来排序。

     T:按该进程使用的CPU时间累积排序。

     k:给某个PID一个信号

     r:给某个PID重新确定一个值。

范例一:每两秒钟更新一次 top ,观察整体信息:

[root@www ~]# top -d 2

top - 17:03:09 up 7 days, 16:16,  1 user,  load average: 0.00, 0.00, 0.00

Tasks:  80 total,   1 running,  79 sleeping,   0 stopped,   0 zombie

Cpu(s):  0.5%us,  0.5%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:    742664k total,   681672k used,    60992k free,   125336k buffers

Swap:  1020088k total,       28k used,  1020060k free,   311156k cached

    <==如果加入 k 或 r 时,就会有相关的字样出现在这里喔!

  PID USER      PR  NI  VIRT  RES  SHR  S  %CPU  %MEM    TIME+  COMMAND     

14398  root       15   0   2188  1012  816  R   0.5     0.1        0:00.05    top

    1  root       15   0   2064   616  528  S   0.0     0.1        0:01.38    init

    2  root       RT  -5     0    0    0    S   0.0     0.0        0:00.00    migration/0

    3  root       34   19     0   0    0    S   0.0     0.0        0:00.00    ksoftirqd/0

top 主要分为两个画面,上面的画面为整个系统的资源使用状态,基本上总共有六行,显示的内容依序是:

第一行(top...):这一行显示的信息分别为: 

目前的时间,亦即是 17:03:09 那个项目; 

开机到目前为止所经过的时间,亦即是 up 7days, 16:16 那个项目; 

已经登入系统的使用者人数,亦即是 1 user项目; 

系统在 1, 5, 15 分钟的平均工作负载。我们在第十六章谈到的 batch 工作方式为负载小于 0.8 就是这个负载啰!代表的是 1, 5, 15 分钟,系统平均要负责运作几个程序(工作)的意思。 越小代表系统越闲置,若高于 1 得要注意你的系统程序是否太过繁复了! 

第二行(Tasks...):显示的是目前程序的总量与个别程序在什么状态(running, sleeping, stopped, zombie)。 比较需要注意的是最后的 zombie 那个数值,如果不是 0 !好好看看到底是那个 process 变成僵尸了吧?

第三行(Cpus...):显示的是 CPU 的整体负载,每个项目可使用 ? 查阅。需要特别注意的是 %wa ,那个项目代表的是 I/O wait, 通常你的系统会变慢都是 I/O 产生的问题比较大!因此这里得要注意这个项目耗用 CPU 的资源喔! 另外,如果是多核心的设备,可以按下数字键『1』来切换成不同 CPU 的负载率。

第四行与第五行:表示目前的物理内存与虚拟内存 (Mem/Swap) 的使用情况。 再次重申,要注意的是 swap 的使用量要尽量的少!如果 swap 被用的很大量,表示系统的物理内存实在不足!

第六行:这个是当在 top 程序当中输入指令时,显示状态的地方。 

至于 top 下半部分的画面,则是每个 process 使用的资源情况。比较需要注意的是:

PID :每个 process 的 ID 啦! 

USER:该 process 所属的使用者; 

PR :Priority 的简写,程序的优先执行顺序,越小越早被执行; 

NI :Nice 的简写,与 Priority 有关,也是越小越早被执行; 

%CPU:CPU 的使用率; 

%MEM:内存的使用率; 

TIME+:CPU 使用时间的累加; 

top 预设使用 CPU 使用率 (%CPU) 作为排序的重点,如果你想要使用内存使用率排序,则可以按下『M』, 若要回复则按下『P』即可。如果想要离开 top 则按下『 q 』

那如果你想要观察的程序 CPU 与内存使用率都很低,结果老是无法在第一行显示时,我们可以仅观察单一程序喔!如下所示: 

范例三:我们自己的bash PID可由 $$ 变量取得,请使用 top 持续观察该 PID 

[root@www ~]# echo $$ 

13639  <==就是这个数字!他是我们 bash 的 PID 

[root@www ~]# top -d 2 -p 13639 

top - 17:31:56 up 7 days, 16:45,  1 user,  load average: 0.00, 0.00, 0.00 

Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie 

Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  

0.0%st 

Mem:    742664k total,   682540k used,    60124k free,   126548k buffers 

Swap:  1020088k total,       28k used,  1020060k free,   311276k cached 

 

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  

COMMAND 

13639 root      15   0  5148 1508 1220 S  0.0  0.2   0:00.18 bash 

 

3 pstree

pstree

[root@www ~]# pstree [-A|U] [-up]

选项与参数:

-A  :各程序树之间的连接以 ASCII 字符来连接;

-U  :各程序树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;

-p  :并同时列出每个 process 的 PID;

-u  :并同时列出每个 process 的所属账号名称。

 

范例一:列出目前系统上面所有的程序树的相关性:

[root@www ~]# pstree -A

init-+-acpid

     |-atd

     |-auditd-+-audispd---{audispd}  <==这行与底下一行为 auditd 分出来的子程序

     |        `-{auditd}

     |-automount---4*[{automount}]   <==预设情况下,相似的程序会以数字显示

....(中间省略)....

     |-sshd---sshd---bash---pstree   <==就是我们指令执行的那个相依性!

....(底下省略)....

# 注意一下,为了节省版面,已经删去很多程序了!

范例二:承上题,同时列出 PID 与 users 

[root@www ~]# pstree -Aup

init(1)-+-acpid(4555)

        |-atd(18593)

        |-auditd(4256)-+-audispd(4258)---{audispd}(4261)

        |              `-{auditd}(4257)

        |-automount(4536)-+-{automount}(4537) <==程序相似但 PID 不同!

        |                 |-{automount}(4538)

        |                 |-{automount}(4541)

        |                 `-{automount}(4544)

....(中间省略)....

        |-sshd(4586)---sshd(16903)---bash(16905)---pstree(16967)

....(中间省略)....

        |-xfs(4692,xfs)   <==因为此程序拥有者并非执行 pstree 者!所以列出账号

....(底下省略)....

# 在括号 () 内的即是 PID 以及该程序的 owner 喔!不过,由于我是使用 

# root 的身份执行此一指令,所以属于 root 的程序就不会显示出来啦!

 

进程的删除

你可以使用 kill -l (小写的 L ) 或者是 man 7 signal 都可以查询到!主要的信号代号与名称对应及内容是:

代号

名称

内容

1

SIGHUP

启动被终止的程序,可让该 PID 重新读取自己的设定档,类似重新启动

2

SIGINT

相当于用键盘输入 [ctrl]-c 来中断一个程序的进行

9

SIGKILL

代表强制中断一个程序的进行,如果该程序进行到一半, 那么尚未完成的部分可能会有『半产品』产生,类似 vim会有 .filename.swp 保留下来。

15

SIGTERM

以正常的结束程序来终止该程序。由于是正常的终止, 所以后续的动作会将他完成。不过,如果该程序已经发生问题,就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的。

17

SIGSTOP

相当于用键盘输入 [ctrl]-z 来暂停一个程序的进行

上面仅是常见的 signal 而已,更多的讯号信息请自行 man 7 signal 吧!

Kill可以帮我们将信号传送给某个作业(%number)或者是某个PID(直接输入数字)。

例子:

以 ps 找出 syslog 这个程序的 PID 后,再使用 kill 传送讯息,使得 syslog 可以重新读取设定档。 

答: 

由于需要重新读取设定档,因此 signal 是 1 号。至于找出 syslog 的 PID 可以是这样做: 

ps aux | grep 'syslog' | grep -v 'grep'| awk '{print $2}'

接下来则是实际使用 kill -1 PID,因此,整串指令会是这样: 

kill -SIGHUP $(ps aux|grep 'syslog'|grep -v 'grep'|awk '{print $2}')

或者是:kill -SIGHUP `ps aux|grep 'syslog'|grep -v 'grep'|awk '{print $2}'`

如果要确认有没有重新启动 syslog ,可以参考登录档的内容,使用如下指令查阅: 

tail -5 /var/log/messages

如果你有看到类似『Mar 19 15:08:20 www syslogd 1.4.1: restart』之类的字样,就是表示 syslogd 在 3/19 有重新启动 (restart) 过了! 

了解了这个用法以后,如果未来你想要将某个莫名其妙的登入者的联机删除的话,就可以透过使用 pstree -p 找到相关程序, 然后再以 kill -9 将该程序删除,该条联机就会被踢掉了!

Kill后面必须加上PID或者是作业号。

Killall命令:

[root@www ~]# killall [-iIe] [command name]

选项与参数:

-i  :interactive 的意思,交互式的,若需要删除时,会出现提示字符给使用者;

-e  :exact 的意思,表示『后面接的 command name 要一致』,但整个完整的指令不能超过 15 个字符。

-I  :指令名称(可能含参数)忽略大小写。

范例一:给予 syslogd 这个指令启动的 PID 一个 SIGHUP 的讯号

[root@www ~]# killall -1 syslogd

# 如果用 ps aux 仔细看一下,syslogd 才是完整的指令名称。但若包含整个参数,

# 则 syslogd -m 0 才是完整的呢!

范例二:强制终止所有以 httpd 启动的程序

[root@www ~]# killall -9 httpd

范例三:依次询问每个 bash 程序是否需要被终止运作!

[root@www ~]# killall -i -9 bash

Kill bash(16905) ? (y/N) n <==这个不杀!

Kill bash(17351) ? (y/N) y <==这个杀掉!

# 具有互动的功能!可以询问你是否要删除 bash 这个程序。要注意,若没有 -i 的参数,

# 所有的 bash 都会被这个 root 给杀掉!包括 root 自己的 bash 喔! ^_^

总之,要删除某个程序,我们可以使用 PID 或者是启动该程序的指令名称, 而如果要删除某个服务呢?呵呵!最简单的方法就是利用 killall , 因为他可以将系统当中所有以某个指令名称启动的程序全部删除。 举例来说,上面的范例二当中,系统内所有以 httpd 启动的程序,就会通通的被删除。

 

关于程序的执行顺序 

Priority 与 Nice 值 

我们 Linux 给予程序一个所谓的『优先执行序 (priority, PRI)』, 这个 PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的, 用户无法直接调整 PRI 值的。先来瞧瞧 PRI 曾在哪里出现? 

[root@www ~]# ps -l 

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD 

4 S     0 18625 18623  2  75   0 -  1514 wait   pts/1    00:00:00 bash 

4 R     0 18653 18625  0  77   0 -  1102 -      pts/1    00:00:00 ps 

由于 PRI 是核心动态调整的,我们用户也无权去干涉 PRI !那如果你想要调整程序的优先执行序时,就得要透过 Nice 值了!Nice 值就是上表的 NI 啦!一般来说, PRI 与 NI 的相关性如下: 

PRI(new) = PRI(old) + nice 

不过你要特别留意到,如果原本的 PRI 是 50 ,并不是我们给予一个 nice = 5 ,就会让 PRI 变成 55 喔! 因为 PRI 是系统『动态』决定的,所以,虽然 nice 值是可以影响 PRI ,不过, 最终的 PRI 仍是要经过系统分析后才会决定的。另外, nice 值是有正负的喔,而既然 PRI 越小越早被执行, 所以,当 nice 值为负值时,那么该程序就会降低 PRI 值,亦即会变的较优先被处理。此外,你必须要留意到: 

·  nice 值可调整的范围为 -20 ~ 19 ; 

·  root 可随意调整自己或他人程序的 Nice 值,且范围为 -20 ~ 19 ; 

·  一般用户仅可调整自己程序的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源); 

·  一般使用者仅可将 nice 值越调越高,例如本来 nice 为 ,则未来仅能调整到大于 5; 

那么如何给予某个程序 nice 值呢?有两种方式,分别是: 

·  一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令; 

·  调整某个已经存在的 PID 的 nice 值:用 renice 指令。 

nice :新执行的指令即给予新的 nice 值 

[root@www ~]# nice [-n 数字] command 

选项与参数: 

-n  :后面接一个数值,数值的范围 -20 ~ 19。 

范例一:用 root 给一个 nice 值为 -5 ,用于执行 vi ,并观察该程序! 

[root@www ~]# nice -n -5 vi & 

[1] 18676 

[root@www ~]# ps -l 

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD 

4 S     0 18625 18623  0  75   0 -  1514 wait   pts/1    00:00:00 bash 

4 T     0 18676 18625  0  72  -5 -  1242 finish pts/1    00:00:00 vi 

4 R     0 18678 18625  0  77   0 -  1101 -      pts/1    00:00:00 ps 

原本的bash PRI 为 75  ,所以 vi 预设应为 75。不过由于给予 nice  为 -5 , 

因此 vi 的 PRI 降低了!但并非降低到 70 ,因为核心还会动态调整! 

[root@www ~]# kill -9 %1 <==测试完毕将 vi 关闭 

renice :已存在程序的 nice 重新调整 

[root@www ~]# renice [number] PID 

选项与参数: 

PID :某个程序的 ID 啊! 

范例一:找出自己的 bash PID ,并将该 PID 的 nice 调整到 10 

[root@www ~]# ps -l 

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD 

4 S     0 18625 18623  0  75   0 -  1514 wait   pts/1    00:00:00 bash 

4 R     0 18712 18625  0  77   0 -  1102 -      pts/1    00:00:00 ps 

 

[root@www ~]# renice 10 18625 

18625: old priority 0, new priority 10 

[root@www ~]# ps -l 

F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD 

4 S     0 18625 18623  0  85  10 -  1514 wait   pts/1    00:00:00 bash 

4 R     0 18715 18625  0  87  10 -  1102 -      pts/1    00:00:00 ps 

 

系统资源的观察 

除了系统的程序之外,我们还必项就系统的一些资源进行检查啊!举例来说,我们使用 top 可以看到很多系统的资源对吧!那么,还有没有其他的工具可以查阅的? 当然有啊!底下这些工具指令可以玩一玩! 

free :观察内存使用情况 

[root@www ~]# free [-b|-k|-m|-g] [-t] 

选项与参数: 

-b  :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes) ,k(Kbytes), 及 g(Gbytes) 来显示单位喔! 

-t  :在输出的最终结果,显示物理内存不 swap 的总量。 

范例一:显示目前系统的内存容量 

[root@www ~]# free -m 

          total       used    free   shared   buffers    cached 

Mem:        725        666      59        0       132       287 

-/+ buffers/cache:     245     479 

Swap:       996          0     996 

uname:查阅系统下核心相关信息 

[root@www ~]# uname [-asrmpi] 

选项与参数: 

-a  :所有系统相关的信息,包括底下的数据都会被列出来; 

-s  :系统核心名称 

-r  :核心的版本 

-m  :本系统的硬件名称,例如 i686 x86_64 等; 

-p  CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型! 

-i  :硬件的平台 (ix86) 

范例一:输出系统的基本信息 

[root@www ~]# uname -a 

Linux www.vbird.tsai 2.6.18-92.el5 #1 SMP Tue Jun 10 18:49:47 EDT 2008 

i686 

i686 i386 GNU/Linux 

uptime

这个命令就是现实当前系统已开机时间,以及1/5/15分钟的平均负荷。

[root@linux ~] #uptime

 

 netstat:追踪网络或插槽文件 

 这个指令的执行如下所示:基本上, netstat 的输出分为两大部分,分别是网络与系统自己的程序相关性部分: 

[root@linux ~] # netstat –[atunlp]

参数:

[root@www ~]# netstat -[atunlp]

选项与参数:

-a  :将目前系统上所有的联机、监听、Socket 数据都列出来

-t  :列出 tcp 网络封包的数据

-u  :列出 udp 网络封包的数据

-n  :不已程序的服务名称,以埠号 (port number) 来显示;

-l  :列出目前正在网络监听 (listen) 的服务;

-p  :列出该网络服务的程序 PID 

 

范例一:列出目前系统已经建立的网络联机与 unix socket 状态

[root@www ~]# netstat

Active Internet connections (w/o servers) <==与网络较相关的部分

Proto Recv-Q Send-Q Local Address        Foreign Address      State

tcp        0    132 192.168.201.110:ssh  192.168.:vrtl-vmf-sa ESTABLISHED

Active UNIX domain sockets (w/o servers)  <==与本机的程序自己的相关性(非网络)

Proto RefCnt Flags       Type       State         I-Node Path

unix  20     [ ]         DGRAM                    9153   /dev/log

unix  3      [ ]         STREAM     CONNECTED     13317  /tmp/.X11-unix/X0

unix  3      [ ]         STREAM     CONNECTED     13233  /tmp/.X11-unix/X0

unix  3      [ ]         STREAM     CONNECTED     13208  /tmp/.font-unix/fs7100

....(中间省略)....

在上面的结果当中,显示了两个部分,分别是网络的联机以及 linux 上面的 socket 程序相关性部分。 我们先来看看因特网联机情况的部分:

[root@linux ~] # netstat –tulnp

Active Internet connections (only servers) 

Proto Recv-Q Send-Q Local Address    Foreign Address  State   

PID/Program name 

tcp        0      0 127.0.0.1:2208   0.0.0.0:*        LISTEN  4566/hpiod 

tcp        0      0 0.0.0.0:111      0.0.0.0:*        LISTEN  4328/portmap 

tcp        0      0 127.0.0.1:631    0.0.0.0:*        LISTEN  4597/cupsd 

tcp        0      0 0.0.0.0:728      0.0.0.0:*        LISTEN  4362/rpc.statd 

tcp        0      0 127.0.0.1:25     0.0.0.0:*        LISTEN  4629/sendmail:  

tcp        0      0 127.0.0.1:2207   0.0.0.0:*        LISTEN  4571/python 

tcp        0      0 :::22            :::*             LISTEN  4586/sshd 

除了可以列出监听网络接口与状忞之外,最后一个字段还能够显示此服务的 

# PID 号码以及程序的指令名称喔!例如最后一行的 4586 就是该 PID 

 

范例三:将上述的本地端 127.0.0.1:631 那个网络服务关闭的话? 

[root@www ~]# kill -9 4597 

[root@www ~]# killall -9 cupsd 

 

 dmesg

利用这命令可以查看开始时候的信息

vmstat :侦测系统资源变化 

如果你想要动态的了解一下系统资源的运作,那么这个 vmstat 确实可以玩一玩!vmstat 可以侦测『 CPU / 内存 / 磁盘输入输出状态 』等等,如果你想要了解一部繁忙的系统到底是哪个环节最累人,可以使用 vmstat 分析看看。底下是常见的选项与参数说明: 

[root@www ~]# vmstat [-a] [延迟 [总计侦测次数]] <==CPU/内存等信息 

[root@www ~]# vmstat [-fs]                      <==内存相关 

[root@www ~]# vmstat [-S 单位]                  <==设定显示数据的单位 

[root@www ~]# vmstat [-d]                       <==与磁盘有关 

[root@www ~]# vmstat [-p 分割槽]                <==与磁盘有关 

选项与参数: 

-a  :使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出信息; 

-f  :将开机到目前为止,系统复制 (fork) 的程序数; 

-s  :将一些事件 (开机至目前为止) 导致的内存变化情况列表说明; 

-S  :后面可以接单位,让显示的数据有单位。例如 K/M 取代 bytes 的容量; 

-d  :列出磁盘的读写总量统计表 

-p  :后面列出分割槽,可显示该分割槽的读写总量统计表 

范例一:统计目前主机 CPU 状态,每秒一次,共计三次! 

[root@www ~]# vmstat 1 3 

procs -----------memory---------- ---swap-- -----io---- --system-- -----

cpu------ 

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 

 0  0     28  61540 137000 291960    0    0     4     5   38   55  0  0 100  0  0 

 0  0     28  61540 137000 291960    0    0     0     0 1004   50  0  0 100  0  0 

 0  0     28  61540 137000 291964    0    0     0     0 1022   65  0  0 100  0  0 

基本说明如下:

内存字段 (procs) 的项目分别为: 

r :等待运作中的程序数量;b:不可被唤醒的程序数量。这两个项目越多,代表系统越忙碌 (因为系统太忙,所以很多程序就无法被执行或一直在等待而无法被唤醒之故)。 

内存字段 (memory) 项目分别为: 

swpd:虚拟内存被使用的容量; free:未被使用的内存容量; buff:用于缓冲存储器; 

cache:用于高速缓存。 这部份则与 free 是相同的。 

内存置换空间 (swap) 的项目分别为: 

si:由磁盘中将程序取出的量; so:由于内存不足而将没用到的程序写入到磁盘的 swap 的容量。 如果 si/so 的数值太大,表示内存内的数据常常得在磁盘与主存储器之间传来传去,系统性能会很差! 

磁盘读写 (io) 的项目分别为: 

bi:由磁盘写入的区块数量; bo:写入到磁盘去的区块数量。如果这部份的值越高,代表系统的 I/O 非常忙碌! 

系统 (system) 的项目分别为: 

in:每秒被中断的程序次数; cs:每秒钟进行的事件切换次数;这两个数值越大,代表系统与接口设备的沟通非常频繁! 这些接口设备当然包括磁盘、网络卡、时间钟等。 

CPU 的项目分别为: 

us:非核心层的CPU 使用状态; sy:核心层所使用的CPU 状态; id:闲置的状忞; wa:等待 I/O 所耗费的CPU 状态; st:被虚拟机 (virtual machine) 所盗用的 CPU 使用状态 

 

具有 SUID/SGID 权限的指令执行状态 

SUID 的权限其实与程序的相关性非常的大!先来看看 SUID 的程序是如何被一般用户执行,且具有什么特色呢? 

·  SUID 权限仅对二进制程序(binary program)有效; 

·  执行者对于该程序需要具有 x 的可执行权限; 

·  本权限仅在执行该程序的过程中有效 (run-time); 

·  执行者将具有该程序拥有者 (owner)的权限。

所以说,整个 SUID 的权限会生效是由于『具有该权限的程序被触发』,而我们知道一个程序被触发会变成程序, 所以啰,执行者可以具有程序拥有者的权限就是在该程序变成程序的那个时候啦! 

那么既然 SUID/SGID 的权限是比较可怕的,您该如何查询整个系统的 SUID/SGID 的档案呢? 应该是还不会忘记吧?使用 find 即可啊! 

find / -perm +6000 

 

/proc/* 代表的意义其实,我们之前提到的所谓的程序都是在内存当中嘛!而内存当中的数据又都是写入到 /proc/* 这个目录下的,所以啰,我们当然可以直接观察 /proc 这个目录当中的档案啊! 如果你观察过 /proc 这个目录的话,应该会发现他有点像这样:

[root@www ~]# ll /proc 

dr-xr-xr-x  5 root      root              0 Mar 11 08:46 1 

dr-xr-xr-x  5 root      root              0 Mar 11 00:46 10 

dr-xr-xr-x  5 root      root              0 Mar 11 00:46 11 

基本上,目前主机上面的各个程序的 PID 都是以目录的型态存在于/proc 当中。 举例来说,我们开机所执行的第一支程序 init 他的 PID 是 1 , 这个 PID 的所有相关信息都写入在 /proc/1/* 当中!若我们直接观察 PID 为 1 的数据好了,他有点像这样: 

[root@www ~]# ll /proc/1 

dr-xr-xr-x 2 root root 0 Mar 12 11:04 attr 

-r-------- 1 root root 0 Mar 17 14:32 auxv 

-r--r--r-- 1 root root 0 Mar 17 14:32 cmdline  <==就是指令串 

-rw-r--r-- 1 root root 0 Mar 17 14:32 coredump_filter 

-r--r--r-- 1 root root 0 Mar 17 14:32 cpuset 

lrwxrwxrwx 1 root root 0 Mar 17 14:32 cwd -> / 

-r-------- 1 root root 0 Mar 17 14:32 environ  <==一些环境变量 

lrwxrwxrwx 1 root root 0 Mar 17 14:32 exe -> /sbin/init  <==实际执行的指令 

....(以下省略).... 

里面的数据还挺多的,不过,比较有趣得其实是两个档案,分别是: 

·  cmdline:这个程序被启动的指令串; 

·  environ:这个程序的环境变量内容。

相关的档案与对应的内容是这样的:   

查询已打开的文件或已执行进程打开的文件

1 fuser

这个命令可以查看当前那个进程在使用该文件或目录或者设备。

[root@www ~]# fuser [-umv] [-k [i] [-signal]] file/dir

选项与参数:

-u  :除了程序的 PID 之外,同时列出该程序的拥有者;

-m  :后面接的那个档名会主动的上提到该档案系统的最顶层,对 umount 不成功很有效!

-v  :可以列出每个档案与程序还有指令的完整相关性!

-k  :找出使用该档案/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;

-i  :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!

-signal:例如 -1 -15 等等,若不加的话,预设是 SIGKILL (-9) 啰!

 

范例一:找出目前所在目录的使用 PID/所属账号/权限 为何?

[root@www ~]# fuser -uv .

                     USER        PID ACCESS COMMAND

.:                   root      20639 ..c.. (root)bash

看到输出的结果没?他说『.』底下有个 PID 为 20639 的程序,该程序属于 root 且指令为 bash 。 比较有趣的是那个 ACCESS 的项目,那个项目代表的意义为:

c :此程序在当前的目录下(非次目录); 

e :可被触发为执行状态; 

f :是一个被开启的档案; 

r :代表顶层目录 (root directory); 

F :该档案被开启了,不过在等待回应中; 

m :可能为分享的动态函式库; 

2 lsof

Fuser是由文件或设备区找使用该文件或设备的进程,反过来,如何查出某个进程打开或使用的文件与设备?用lsof命令咯呼呼!那就是使用 lsof 啰~

[root@www ~]# lsof [-aUu] [+d]

选项与参数:

-a  :多项数据需要『同时成立』才显示出结果时!

-U  :仅列出 Unix like 系统的 socket 档案类型;

-u  :后面接 username,列出该使用者相关程序所开启的档案;

+d  :后面接目录,亦即找出某个目录底下已经被开启的档案!

 

范例一:列出目前系统上面所有已经被开启的档案与装置:

[root@www ~]# lsof

COMMAND PID  USER   FD  TYPE  DEVICE   SIZE     NODE NAME

init      1  root  cwd   DIR     3,2   4096        2 /

init      1  root  rtd   DIR     3,2   4096        2 /

init      1  root  txt   REG     3,2  38620  1426405 /sbin/init

....(底下省略)....

# 注意到了吗?是的,在预设的情况下, lsof 会将目前系统上面已经开启的

# 档案全部列出来~所以,画面多的吓人啊!您可以注意到,第一个档案 init 执行的

# 地方就在根目录,而根目录,嘿嘿!所在的 inode 也有显示出来喔!

 

范例二:仅列出关于 root 的所有程序开启的 socket 档案

[root@www ~]# lsof -u root -a -U

COMMAND     PID USER   FD   TYPE     DEVICE SIZE   NODE NAME

udevd       400 root    3u  unix 0xedd4cd40        1445 socket

auditd     4256 root    7u  unix 0xedd4c380        9081 socket

audispd    4258 root    0u  unix 0xedd4c1e0        9080 socket

# 注意到那个 -a 吧!如果你分别输入 lsof -u root 及 lsof -U ,会有啥信息?

# 使用 lsof -u root -U 及 lsof -u root -a -U ,呵呵!都不同啦!

# -a 的用途就是在解决同时需要两个项目都成立时啊! ^_^

 

范例三:请列出目前系统上面所有的被启动的周边装置

[root@www ~]# lsof +d /dev

COMMAND     PID      USER   FD   TYPE     DEVICE SIZE  NODE NAME

init          1      root   10u  FIFO       0,16       1147 /dev/initctl

udevd       400      root    0u   CHR        1,3       1420 /dev/null

udevd       400      root    1u   CHR        1,3       1420 /dev/null

udevd       400      root    2u   CHR        1,3       1420 /dev/null

# 看吧!因为装置都在 /dev 里面嘛!所以啰,使用搜寻目录即可啊!

 

范例四:秀出属于 root 的 bash 这支程序所开启的档案

[root@www ~]# lsof -u root | grep bash

bash   20639 root  cwd    DIR    3,2    4096    648321 /root

bash   20639 root  rtd    DIR    3,2    4096         2 /

bash   20639 root  txt    REG    3,2  735004   1199424 /bin/bash

bash   20639 root  mem    REG    3,2   46680     64873 /lib/libnss_files-2.5.so

....(底下省略)....

这个指令可以找出您想要知道的某个程序是否有启用哪些信息?例如上头提到的范例四的执行结果呢! 3

3 pidof

找出某个正在执行的程序的 PID

[root@www ~]# pidof [-sx] program_name

选项与参数:

-s  :仅列出一个 PID 而不列出所有的 PID

-x  :同时列出该 program name 可能的 PPID 那个程序的 PID

 

范例一:列出目前系统上面 init 以及 syslogd 这两个程序的 PID

[root@www ~]# pidof init syslogd

1 4286

# 理论上,应该会有两个 PID 才对。上面的显示也是出现了两个 PID 喔。

# 分别是 init 及 syslogd 这两支程序的 PID 啦。

很简单的用法吧,透过这个 pidof 指令,并且配合 ps aux 与正规表示法,就可以很轻易的找到您所想要的程序内容。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部