先说一下程序吧,程序是一个静态概念,它是“实际存在”于操作系统中的一段指令,或者代码,总之,它是一段可以被成功解释的脚本,或者被编译的代码,在操作系统中我们可以直观的看到。
而进程是一个动态概念,它是指程序运行的过程。
*进程和程序没有直接的关系,一个程序可以启动多个进程,一个进程可以被多个程序调用。
一个常用的查看进程的命令是ps,他能生成一个当前的进程快照
示例:ps
直接使用”ps”我们可以看到有两行数据,一个bash,也就是当前的shell,另一个就是ps本身。我们看到有一列叫PID,它意为进程的ID;TTY,是teletype的缩写,表示终端的类型。TIME表示占用CPU的时间。
不过直接使用ps信息量来得太少,而且他只显示当前终端相关的进程。
有一组常用的命令组合是aux,这能给我们提供足够的信息
aux选项显示了所有用户的进程。值得一提的是,ps能够接受多个不同版本Unix的参数,比如刚才说的aux这组参数,就是BSD的参数,而列表也是BSD风格的。标准一组常用参数是-ef,和aux类似。
以aux这组参数展示的列表为例,说明一下每一列的含义
- USER:表示进程的所有者
- PID:进程ID号
- %CPU:CPU的使用率
- %MEM:内存的使用率
- VSZ:虚拟内存大小
- RSS:占用的内容的大小
- START:进程运行的起始时间,超过24个小时则按天显示
- TTY:已经提过,是终端的类型,但是图上我们看到很多终端显示“?”,这表示他们没有控制终端
这其中多说一下STATE列,这一列表示进程的状态,进程的状态有很多种
- R:运行状态,running
- S:休眠状态,sleeping
- D:不可中断的休眠状态
- T:进程终止
- Z:zombie!这是一个死进程,或者说僵尸进程
- <:高优先级别的进程,“不友好的进程”
- N:低优先级别的进程,“友好的进程”
上面有几个名词需要额外说一下
*僵尸进程:一个进程可以产生另外一个进程,产生的新进程则为子进程,如果子进程已经终止,并且父进程没有从进程列表里清空他,那么子进程就变僵尸了…
*进程优先级别:虽然我们在使用电脑的时候,感觉他同时在做许多事情,但其实他是在飞快的轮换着做很多事,飞快的程度让我们感觉不出他是在轮换着执行,更像是同时执行,既然是轮换执行,那么就有先后之分,进程优先级别越高,那么该进程就会占用更多的CPU时间,级别低的自然就占用的少了。
和ps相似的一个命令叫pstree,输出一个树型结构的进程列表,会展示进程间父/子关系。
程序启动时,调整进程的优先级别:nice
nice只能在程序启动时调整他的优先级别
用法:nice -n 程序,n代表优先级别,取值范围是-20~19,取值范围只能在这里,如果你输入其他的值,比如-30,那么系统会自动调整为-20。
示例:nice –20 我的程序,修改“我的程序”的优先级别为-20,。注意,参数是“–20”,有两个横杠,第二个横杠代表负,第一个横杠代表参数。
修改一个正在运行的程序的优先级别:renice
修改的程序可以正在运行
用法:renice -n 程序,-n是一个参数
示例:renice -5 我的程序,“我的程序”正在运行,修改他的优先级别为-5。这里的-n是一个参数,-5表示负五,并不是五。
动态的去查看进程:top
刚才说过,ps命令是生成一个当前进程的快照,意为只是那一个时刻进程的状态,top命令同样会产生一组进程列表,但是他会定时刷新这组列表,尽量反映最新的进程状态,并且会报告一些进程概要。你可以想象一下Windows下的Ctrl+Alt+Delete
top命令执行后,上方会显示一个进程的概要
概要中比较明显的数值就不一一说明了,但是要看一下那个叫load average的值,他直译过来可以叫做平均负载,他有三个值,这反映了系统最后60s,最后5分钟和最后15分钟内等待运行进程的个数,他可以反映系统忙碌的程度,如果这个值小于1.0,那么说明系统不忙碌。
CPU相关的百分比,man给出了一个说明,注意其中是否友好的进程,其实是代表了优先级高与低的进程。
查看被暂停的或者后台任务的状态:jobs
要说明这个命令,我们需要先知道让一个命令后台执行的方法。除了系统的进程以服务的形式在运行之外,我们可以使用&符号来指明一个命令后台运行,通常他可能是一个耗时的操作,比如备份,大范围搜索等。
示例:find / -name [a*]>~/res.txt &
我们把“&”符号连接在一个命令的后面,使得他变为后台运行,同时,我们使用jobs命令来查看他们,他可能会是这样
我们可以使用fg和bg命令来控制进程在前后台的切换,比如我们将一个搜索放在后台执行,在他没有完成之前,通过jobs查看,它会显示running状态,此时,我们通过“fg jobs编号”命令可以把后台正在运行的进程切换到前台来执行。
进程的控制:kill
是的,就是这么直白!干掉他!当然,这也是kill命令最常用的作用,终止一个进程。
示例:kill 进程id,当我们通过ps或者top发现我们需要操作的进程之后,我们可以使用kill命令来终止相应pid的进程,注意,我这里说的是终止,并不是像命令所说的那样杀死,因为kill能做的远不止终止一个进程。我们通过kill -l可以查看我们可以发送哪些信号给当前进程。
我们看到,这里有很多“信号”,在我们使用“kill PID”的时候,实际上市使用的“kill -15 PID”,-15是kill对一个进程发出的默认信号,它代表终止,但是有时候,这种手段并不管用,那么我们需要使用kill -9来终止一个进程,从图中我们可以看出,-9代表kill,它意味着真正的杀死一个进程。
因为进程的不同,从而导致了进程接收到终止信号后产生的行为也不同,有些能够乖乖的终止,但有些不能。听话的进程在接收到-15(终止信号)后会做一些善后处理之后终止,而那些不听好的或许不予理睬,那么此时我们需要-9(杀死信号)来终止进程,但是这个信号发出之后就相当于一棍打死,没有给进程余地来善后,所以这也是终止进程的杀手锏。
根据名字终止进程:killall
和kill类似,都能够终止进程,但是killall能够根据进程的名称来终止一个或者一组进程
示例:killall httpd,终止所有httpd进程,当然,你需要root权限才能终止其他用户的进程
一些其他的操作
*终止一个正在运行的程序:Ctrl+c,注意,c是cancel,不是copy
*挂起(暂停)一个正在运行的程序:Ctrl+z