linux进程、工作、程序管理(附案例)

进程和程序
1.进程
在 Linux 中运行一个命令时,系统会将相关的权限、属性、程序码与数据等均加载内存, 并给予这个单元一个程序识别码(PID),最终该命令可以进行的任务则与这个 PID 的权限有关。
2.程序
程序一般是放置在实体磁碟中,然后透过使用者的运行来触发。触发后会加载到内存中成为一个个体,那就是程序。
1、程序:程序是静止的,程序就是磁盘上的一个文件。
2、进程:进程是一个正在执行的程序的实例。
3、进程是动态的。
4、一旦程序被操作系统加载进内存了,那么这程序就成为了进程。
父子进程
程序彼此之间有相关性的,连续执行两个bash后,第二个的父程序就是前一个bash。因为i每个程序都有以一个PID,通过parent PID(PPID)来判断(如图)
在这里插入图片描述
●其实子程序与父程序之间的关系还挺复杂的,最大的复杂点在于程序互相之间的调用。在Linux的程序调用通常称为fork-and-exec的流程程序都会借由父程序以复制( fork )的方式产生一个一模一样的子程序,然后被复制出来的子程序再以exec的方式来执行实际要进行的程序,最终就成为-个子程序的存在。整个流程有点像下面这张图:
在这里插入图片描述

■1)系统先以fork的方式复制-一个与父程序相同的暂存程序,这个程序与父程序唯一的差别就是PID不同!但是这个暂存程序还会多-一个PPID的参数,PPID 如前所述,就是父程序的程序识别码啦!然后
(2)暂存程序开始以exec的方式载入实际要执行的程序,以上述图示来讲,新
的程序名称为ggg,最终子程序的程序码就会变成qqq了!
程序和进程区别
程序(program):通常为二进制,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;
进程(process):程序被触发后,运行者的权限与属性、程序的程序码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个识别码 (PID),可以说,进程就是一个正在运行中的程序。
系统或网络服务:常驻在内存的程序
●如果就我们之前学到的一-些指令数据来看,其实我们下达的指令都很简单,包括用Is显示文件啊、用touch创建文件啊、rm/mkdir/cp/mv等指令管理文件啊、chmod/chown/passwd 等等的指令来管理权限等等的,不过,这些指令都是执行完就结束了。 也就是说,该项指令被触发后所产生的PID很快就会终止呢!那有没有一直在执行的程序啊?
●举个简单的例子来说好了,我们知道系统每分钟都会去扫描/etc/crontab以及相关的配置文件,来进行1 C作调度吧?那么那个工作调度是谁负责的?当然是crond这个程序所管理的,我们将他启动在背景当中- -直持续不断的运行,那就是“常驻在内存当中的程序”
●**常驻在内存当中的程序通常都是负责一些系统所提供的功能以服务使用者各项任务,因此这些常驻程序就会被我们称为:服务(daemon)。**系统的服务非常的多,不过主要大致分成系统本身所需要的服务,例如刚刚提到的crond及atd,还有rsyslogd等等的。还有一-些则是负责网络连线的服务,例如Apache, named, postfix, vsftpd… 等等的。这些网络服务比较有趣的地方,在于这些程序被执行后,他会启动一个可以负责网络监听的端口( port), 以提供外部用户端( client )的连线要求。

工作管理(job control)
这个工作管理 (job control) 是用在 bash 环境下的,也就是说:当我们登陆系统取得 bash shell 之后,在单一终端机介面下同时进行多个工作的行为管理 。举例来说,我们在登陆 bash 后, 想要一边复制文件、一边进行数据搜寻、一边进行编译,还可以一边进行 vi 程序撰写! 当然我们可以重复登陆那六个文字介面的终端机环境中,不过,能不能在一个 bash 内达成? 当然可以啊!就是使用 job control。

进行工作管理的行为中, 其实每个工作都是目前 bash 的子程序,亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 bash。

要进行 bash 的 job control 必须要注意到的限制是:
这些工作所触发的程序必须来自於你 shell 的子程序(只管理自己的 bash);
前台:你可以控制与下达命令的这个环境称为前台的工作 (foreground);
后台:可以自行运行的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作;
后台中运行的程序不能等待 terminal/shell 的输入(input)。

job control 的介绍
■直接将指令丢到背景中“ 执行”的 &
●如同前面提到的,我们在只有一个bash的环境下,如果想要同时进行多个工作,那么可以将某些工作直接丢到背景环境当中,让我们可以继续操作前景的工作!那么如何将工作丢到背景中?最简单的方法就是利用“ &"这个玩意儿了!

举个简单的例子我们要将/etc/整个备份成为/tmp/etc.tar.gz且不想要等待,
在这里插入图片描述
我在输入一个指令后,在该指令的最后面加上一个&"代表将该指令丢到背景中,此时bash会给予这个指令一个"工作号码(jobnumber)”,至于后面那3898则是该指令所触发的PID”了!而且,我们可以继续操作bash呢!不过,那么丢到背景中的工作什么时候完成?完成的时候会显示什么?如果你输入几个指令后,突然出现这个数据:
●[1]+完成 tar -zpcf /tmp/etc.tar.gz /etc
■就代表这个工作已经完成( Done )该工作的指令则是接在后面那一串命令行。
另外,这个&代表:”将工作丢到背景中去执行”喔!注意到那个”执行”的字眼!此外,这样的情况最大的好处是:不怕被[ctrI]+C中断的啦!此外,将工作丢到背景当中要特别注意数据的流向喔!包括上面的讯息就有出现错误讯息,导致我的前景被影响。虽然只要按下[enter]就会出现提示字符。但如果我将刚刚那个指令改成:
在这里插入图片描述
在背景当中执行的指令,如果有stdout(标准输出)及stderr (标准错误) 时,他的数据依旧是输出到屏幕.上面的所以,我们会无法看到提示字符,当然也就无法完好的掌握前景工作。同时由于是背景工作的tar,此时你怎么按下[ctrl]+C也无法停止屏幕被搞的花花绿绿的!所以哕,最佳的状况就是利用数据流重导向,将输出数据传送至某个文件中。举例来说,我可以这样做:
在这里插入图片描述
上面将打包的输出信息(包括标准输出和错误输出)都放入/tmp文件中,不会影响前台工作。

将目前的工作丢到后台中暂停:[ctrl]-z
想个情况:如果我正在使用 vi ,却发现我有个文件不知道放在哪里,需要到 bash 环境下进行搜寻,此时是否要结束 vi 呢?呵呵!当然不需要!只要暂时将 vi 给他丢到后台当中等待即可。 例如以下的案例:

[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] 及 z 这两个按键,萤幕上会出现 [1] ,表示这是第一个工作, 而那个 + 代表最近一个被丢进背景的工作,且目前在背景下默认会被取用的那个工作 (与 fg 这个命令有关 )!而那个 Stopped 则代表目前这个工作的状态。在默认的情况下,使用 [ctrl]-z 丢到背景当中的工作都是暂停的状态!

查看目前的后台状态:jobs

[root@www ~]# jobs [-lrs]
选项与参数:
-l :除了列出 job number 与命令串之外,同时列出 PID 的号码;
-r :仅列出正在后台 run 的工作;
-s :仅列出正在后台当中暂停 (stop) 的工作。

范例一:观察目前的 bash 当中,所有的工作,与对应的 PID
[root@www ~]# jobs -l
[1]- 10314 Stopped vim ~/.bashrc
[2]+ 10833 Stopped find / -print

将后台工作拿到前台处理:fg

[root@www ~]# fg %jobnumber
选项与参数:
%jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的!

范例一:先以 jobs 观察工作,再将工作取出:
[root@www ~]# jobs
[1]- 10314 Stopped vim ~/.bashrc
[2]+ 10833 Stopped find / -print
[root@www ~]# fg <==默认取出那个 + 的工作,亦即 [2]。立即按下[ctrl]-z
[root@www ~]# fg %1 <==直接规定取出的那个工作号码!再按下[ctrl]-z
[root@www ~]# jobs
[1]+ Stopped vim ~/.bashrc
[2]- Stopped find / -print

让工作在背景下的状态变成运行中: bg
我们刚刚提到,那个[ctr]-z 可以将目前的工作丢到背景下面去
”’ 暂停那么如何让一个工作在背景下面“ Run”呢?
案例

rootwww ~]# find / perm /7000 > /tmp/text. txt 立刻丢到背景去暂停!
find: . /proc/4134/task/4134/fd/6’ :没有那个文件或目录
find:‘ /proc/4134/task/ 4134/ fdinfo/6’ :没有那个文件或目录
find:‘ /proc/4134/fd/6’ :没有那个文件或目录
find:‘ /proc/4134/fdinfo/6’:没有那个文件或目录
^Z
[4]+已停止 find / perm /7000 > /tmp/text. txt
#此时,请立刻按下[ctr1]-z 暂停!

[root@www~]# jobs ; bg %4 ; jobs
[2]-已停止 vim~ /. ba shrc
[3]已停止 find 1 -print
[4]+已停止 find 1 perm /7000 > /tmp/text. txt
[4]+ find / perm /7000 > /tmp/text. txt &
[2]+已停止 vim~/. ba shrc
[3]已停止 find / -print
[4]-运行中 find / -perm /7000 > /tmp/text. txt &

已经由停止变成运行了,命令行最后多了一个&的符号,代表该工作被启动在背景当中了

管理背景当中的工作: kill
上面可以使用 fg 将后台工作拿到前台来, 那么,如果想要将该工作直接移除呢?或者是将该工作重新启动呢?这个时候就得需要给予该工作一个讯号 (signal) ,此时, kill 这个命令就派上用场啦!
[root@www^ ]# kill- -signal %jobnumber //命令格式
[root@www~ ]# kill -1
选项与参数:

●-1 :这个是L的小写,列出目前ki11能够使用的讯号(si gna1)有哪些?
●signal :代表给予后面接的那个工作什么样的指示哕!用man 7 signal可知:
●-1 :重新读取一次参数的配置文件(类似reload) ;
●-2 :代表与由键盘输入[ctr1]-c 同样的动作;
●-9 :立刻强制删除一个工作;
●-15: 以正常的程序方式终止一项工作。与-9是不一样的。

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

[root@www~ ]# jobs
[2]+ 已停止 vim ~1. bashrc
[3] 已停止 find / -print :
[root@www ~]# kill -9 %3; jobs
[2]+ 已停止 vim~/. bashrc
[3] 已停止 find / -print
[3] 已杀死 find / -print
#再过几秒你再下达jobs -次,就会发现3号工作不见了!因为被移除了!

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

[root@www~]# jobs
[2]+已停止 vim /. bashrc

-SIGTERIM与-15 是-样的!您可以使用ki1l -1 来查阅!

不过在这个案例中,vim 的工作无法被结束喔!因为他无法通过kill正常终止的意思!

■特别留意一下,-9这个signal通常是用在” 强制删除一个不正常的工作”时所
使用的,-15 则是以正常步骤结束-项工作( 15也是默认值),两者之间并不相
同呦!举上面的例子来说,我用vim的时候,不是会产生-个.filename.swp.的
文件吗?那么,当使用-15这个signal时,vim 会尝试以正常的步骤来结束掉该
vi的工作,所以.filename.swp会主动的被移除。但若是使用-9这个signal时,
由于该vim工作会被强制移除掉,因此,.filename.swp 就会继续存在文件系统当中。

不过毕竟正常的作法中你应该先使用fo来取回前景控制权,然后再离开vim才对一因此,以上面的范例为例其实kil确实无法使用-15正常的结束掉vim的动作喔!此时还是不建议使用-9啦!因为你知道如何正常结束该程序不是吗?通常使用-9是因为某些程序你真的不知道怎么通过正常手段去终止他,这才用到-9的!

离线管理问题:nohup
要注意的是,我们在工作管理当中提到的后台指的是在终端机模式下可以避免 [crtl]-c 中断的一个情境, 并不是放到系统的后台!所以,工作管理的背景依旧与终端机有关啦! 在这样的情况下,如果你是以远程连线方式连接到你的 Linux 主机,并且将工作以 & 的方式放到后台去, 请问,在工作尚未结束的情况下你离线了,该工作还会继续进行吗?答案是『否』!不会继续进行,而是会被中断掉。
方法一: at 来处理!因为 at 是将工作放置到系统后台, 而与终端机无关。
方法二:使用nohup!nohup可以让你在离线或注销系统后,还能够让工作继续进行。他的语法有点像这样:

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

上述指令需要注意的是, nohup.并不支持bash内置的指令,因此你的指令必须要是外部指令才行。
Linux的命令可以分为内部命令和外部命令:
内置命令在系统启动时就调入内存,是常驻内存的,所以执行效率高。而外部命令是系统的软件功能,用户需要时才从硬盘中读入内存。which只能在PATH变量中搜索命令的绝对路径,内置命令是内置在bash中的,所以我们找不到命令的绝对路径,
案例

#1.先编辑一支会“睡着500秒”的程序:
[root@www ~]# vim sleep500. sh
#! /bin/bash
/bin/s1 eep 500s
/bin/echo "I have s1 ept 500 seconds.

#2. 丢到背景中去执行,并且立刻登出系统:
[root@www~ ]# chmod a+x sleep500. sh
[root@www~ ]# nohup . /sleep500. sh &
[3] 4453
[root@www~ ]# nohup:忽略输入并把输出追加到”nohup. out”<== 会告知这个讯息!
[root@www ~]#exit
exit
有停止的任务。

如果你再次登陆的话,再使用pstree去查阅你的程序,会发现sleep500.sh还在执行中喔!并不会被中断掉!这样了解意思了吗?由于我们的程序最后会输出一个讯息,但是nohup与终端机其实无关了,因此这个讯息的输出就会被导向“~/nohup.out",所以你才会看到上述指令中,当你输入nohup后,会出现那
个提示讯息罗

程序管理
利用静态的 ps 或者是动态的 top,还能以 pstree 来查阅程序树之间的关系。
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 :做一个更为完整的输出。

案例
在这里插入图片描述
所以你看到的ps. -|输出讯息中,他说明的是: "bash 的程序属于UID为0的
使用者,状态为睡眠( sleep),之所以为睡眠因为他触发了DS (状态为run
)之故。此程序的PID为14836,优先执行顺序为80,下达bash所取得的终
端接口为pts/0,运行状态为等待( wait )

■F:代表这个程序旗标( process flags ) ,说明这个程序的总结权限,常见号码有:
●若为4表示此程序的权限为root ;
●若为1则表示此子程序仅进行复制( fork )而没有实际执行( exec )。
■S:代表这个程序的状态( STAT) ,主要的状态有:
●R ( Running) :该程序正在运行中;
●s ( Sleep) :该程序目前正在睡眠状态( idle ),但可以被唤醒( signal )
●D:不可被唤醒的睡眠状态,通常这支程序可能在等待I/0的情况( ex>打印)
●T:停止状态( stop),可能是在工作控制(背景暂停)或除错( traced )状态;
●Z ( Zombie ) :僵尸状态,程序已经终止但却无法被移除至内存外。
■UID/PID/PPID: 代表‘”此程序被该UID所拥有I程序的PID号码I此程序的父程序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的缩写,造成此程序的触发程序之指令为何。

动态查看进程:top

[root@www ~]# top [-d 数字] | top [-bnp]
选项与参数:
-d :后面可以接秒数,就是整个程序画面升级的秒数。默认是 5 秒;
-b :以批量的方式运行 top ,还有更多的参数可以使用喔!
通常会搭配数据流重导向来将批量的结果输出成为文件。
-n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
-p :指定某些个 PID 来进行观察监测而已。
在 top 运行过程当中可以使用的按键命令:
? :显示在 top 当中可以输入的按键命令;
P :以 CPU 的使用资源排序显示;
M :以 Memory 的使用资源排序显示;
N :以 PID 来排序喔!
T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
k :给予某个 PID 一个讯号 (signal)
r :给予某个 PID 重新制订一个 nice 值。
q :离开 top 软件的按键。

案例
在这里插入图片描述
■top主要分为两个画面,. 上面的画面为整个系统的资源使用状态,基本上总共有六行,显示的内容依序是:
■第一行(top…) :这一行显示的信息分别为:
●目前的时间,亦即是10:52:16那个项目;
●开机到目前为止所经过的时间,柳是up 1:40,那个项目;
●已经登陆系统的使用者人数,亦郝是2 users,项目;
●系统在1, 5, 15分钟的平均工作负载。代表的是1, 5, 15分钟,系统平均负责运 行几个程序(工作) 的意思。越小代表系统越闲置,若高于1得要注意你的系统 程序是否太过繁复了!
■第二行( Tasks… ) :显示的是目前程序的总量与个别程序在什么状态( running, sleeping, stopped, zombie )。比较需要注意的是最后的zombie那个数值,如果不是0 !好好看看到底是那个process变成僵尸了吧?
■第三行( %Cpu…) :显示的是CPU的整体负载,每个项目可使用?需要特别
注意的是wa项目,那个项目代表的是I/O wait,通常你的系统会变慢都是1/0产
生的问题比较大!因此这里得要注意这个项目耗用CPU的资源喔!另外,如果是.
多核心的设备,可以按下数字键“1” 来切换成不同CPU的负载率。
●6.7% us一用户空间占用CPU的百分比。
●0.4% sy.-内核空间占用CPU的百分比。
●0.0% ni- - . 改变过优先级的进程占用CPU的百分比
●92.9% id一空闲CPU百分比
●0.0% wa- 10等待占用CPU的百分比
●0.0% hi-硬中断(Hardware IRQ) 占用CPU的百分比
●0.0%si 一软中断(Software Interrupts)占用CPU的百分比
●0.0% st --虚拟cpu等待实际cpu的时间百分比
■第四行:内存状态
●8306544k total一物理内存总量(8GB)
●7775876k used - -使用中的内存总量(7.7GB)
●530668k free一空闲内存总量 (530M)
●79236k buffers -缓存的内存量(79M)
■第五行: swap交换分区
●2031608k total-交换区总量(2GB)
●2556k used一使用的交换区总量(2.5M)
●2029052k free -空闲交换区总量(2GB)
●4231276k cached一缓冲的交换区总量(4GB)
■第六行:这个是当在top程序当中输入指令时,显示状态的地方。
●PID:每个process的ID啦!
●USER :该process所属的使用者;
●PR: Priority的简写,程序的优先执行顺序,越小越早被执行;
●NI : Nice的简写,与Priority有关,也是越小越早被执行;
●%CPU:CPU的使用率;
●%MEM :内存的使用率;
●TIME+ : CPU使用时间的累加; .

top也是个挺不错的程序观察工具!但不同于Ps是静态的结果输出,top这个程序可以持续的监测整个系统的程序工作状态。在默认的情况下, 每次更新程序资源的时间为3秒,不过,可以使用-d来进行修改。

pstree

[root@www ~]# pstree [-A|U] [-up]
选项与参数:
-A :各程序树之间的连接以 ASCII 字节来连接;
-U :各程序树之间的连接以万国码的字节来连接。在某些终端介面下可能会有错误;
-p :并同时列出每个 process 的 PID;
-u :并同时列出每个 process 的所属帐号名称。

案例
在这里插入图片描述
killall -signal 命令名称

[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 喔! _

程序之间是可以互相控制的!举例来说,你可以关闭、重新启动服务器软件,服务器软件本身是个程序,你既然可以让她关闭或启动,当然就是可以控制该程序啦!那么程序是如何互相管理的呢?其实是透过给予该程序一个讯号 (signal) 去告知该程序你想要让她作什么!因此这个讯号就很重要!

那么到底有多少 signal 呢? 你可以使用 kill -l (小写的 L ) 或者是 man 7 signal 都可以查询到!主要的讯号代号与名称对应及内容是:
在这里插入图片描述
Priority 与 Nice 值
●我们知道CPU -秒钟可以运行多达数G的微指令次数,通过核心的CPU调度
可以让各程序被CPU所切换运行,因此每个程序在一 秒钟内或多或少都会被
CPU执行部分的指令码。如果程序都是集中在-一个伫列中等待CPU的运行,而不具有优先顺序之分,也就是像我们去游乐场玩热门游戏需要排队- -样,每个人都是照顺序来!你玩过一 遍后还想再玩(没有执行完毕) ,请到后面继续排
队等待。情况有点像下面这样:
在这里插入图片描述
■上图中假设pro1, pro2是紧急的程序,pro3, pro4是- -般的程序,在这样的环境中,由于不具有优先顺序,唉啊! pro1,pro2 还是得要继续等待而没有优待呢!如果pro3, pro4的工作又臭又长!那么紧急的pro1, pro2就得要等待个老半天才能够完成!真麻烦啊!所以哕,我们想要将程序分优先顺序啦!如果优先序较高则运行次数可以较多次,而不需要与较慢优先的程序抢位置!我们可以将程序的优先顺序与CPU调度进行如下图的解释:
在这里插入图片描述
如上图所示,具高优先权的pro1, pro2可以被取用两次,而较不重要的pro3, pro4则运行次数较少。如此一来pro1, pro2就可以较快被完成啦!要注意,上图仅是示意图,并非较优先者-定会被运行两次啦!为了要达到上述的功能,我们Linux给予程序一个所谓的”优先执行序( priority, 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
1
不过你要特别留意到,如果原本的 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 ,则未来仅能调整到大于 5;
这也就是说,要调整某个程序的优先运行序,就是『调整该程序的 nice 值』啦
那么如何给予某个程序 nice 值呢?有两种方式,分别是:
1.一开始运行程序就立即给予一个特定的 nice 值:用 nice 命令;
2.调整某个已经存在的 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 啊!
1
2
3
案例

找出自己的 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

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

仔细看看,我的系统当中有 725MB 左右的实体内存,我的 swap 有 1GB 左右, 那我使用 free -m 以 MBytes 来显示时,就会出现上面的资讯。

Mem 那一行显示的是实体内存的量, Swap 则是虚拟内存的量。 total 是总量, used 是已被使用的量, free 则是剩余可用的量。 后面的 shared/buffers/cached 则是在已被使用的量当中,用来作为缓冲及缓存的量。

仔细的看到范例一的输出喔,我们的 Linux 测试用主机是很平凡的,根本没有什么工作, 但是,我的实体内存是几乎被用光光的情况呢!不过,至少有 132MB 用在缓冲记忆 (buffers) 工作, 287MB 则用在缓存 (cached) 工作,也就是说,系统是『很有效率的将所有的内存用光光』, 目的是为了让系统的存取效能加速啦!

很多人都会问到这个问题:“我的系统明明很轻松,为何内存会被用光光?” 被用光是正常的!而需要注意的反而是 swap 的量。一般来说, swap 最好不要被使用,尤其 swap 最好不要被使用超过 20% 以上, 如果您发现 swap 的用量超过 20% ,那么,最好还是买实体内存来插吧! 因为, Swap 的效能跟实体内存实在差很多,而系统会使用到 swap , 绝对是因为实体内存不足了才会这样做的!

Linux 系统为了要加速系统效能,所以会将最常使用到的或者是最近使用到的文件数据缓存 (cache) 下来, 这样未来系统要使用该文件时,就直接由内存中搜寻取出,而不需要重新读取硬盘,速度上面当然就加快了! 因此,实体内存被用光是正常的!

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

uname 可以列出目前系统的核心版本、 主要硬件平台以及 CPU 类型等等的信息。以上面范例一的状态来说,我的 Linux 主机使用的核心名称为 Linux,而主机名称为 www.vbird.tsai,核心的版本为 2.6.18-92.el5 ,该核心版本创建的日期为 2008/6/10,适用的硬件平台为 i386 以上等级的硬件平台。

uptime:查看系统启动时间与工作负载
这个命令很单纯呢!就是显示出目前系统已经启动多久的时间,以及 1, 5, 15 分钟的平均负载就是了。还记得 top 吧?没错啦!这个 uptime 可以显示出 top 画面的最上面一行!
案例

[root@www lsm]# uptime
09:18:44 up 5:00, 2 users,1oad average: 0. 00,0.01, 0. 05

top这个指令已经谈过相关信息,不再聊!

1
2
3
netstat :追踪网络

[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
…(中间省略)…

范例二:找出目前系统上已在监听的网络连线及其 PID
在这里插入图片描述
在这里插入图片描述
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 :后面列出分区,可显示该分区的读写总量统计表
案例
在这里插入图片描述
■程序字段
( 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使用状态( 2.6.11以后才支持)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值