目录
- 父进程与子进程
- 服务
- 工作管理(& | jobs | fg | bg | kill)
- ps命令
- Priority和nice优先级
父进程与子进程
子进程是父进程衍生出来的程序。举个大家经常使用的例子,我们每次登陆的shell,会触发一个进程,我们都是在这个shell下输入命令进行工作的,其实呢,你输入的命令也会触发一个新的进程,这个新的进程就是子进程,而一开始登陆的shell进程则为父进程。我们做一个小实验,我们在当前登陆shell下再登陆一个新的shell,然后输入一个命令,查看进程的状态信息
PID是该进程的识别码,PPID是父进程的识别码。我们发现第一个bash的PID和第二个bash的PPID都是2446,ping命令的PPID和第二个bash的PID都是2660,说明bash下输入的命令都是当前bash的进程所产生的嘛。
服务(常驻内存)
在系统引导过程中就启动的进程,我们称之为守护进程,也叫服务,并且这类进程会持续的进行,提供系统和网络所必须的功能。
工作管理
通常在当前bash下执行一个任务,必须等待这个任务执行完毕后才能输入命令执行下一个任务,现在我们要进行文档复制、资料查询、软件安装等等多个任务同时工作,这就要用到工作管理的知识。
将任务转到后台(&)
直接在执行任务的命令后边加&,然后我们可以输入命令执行另一个任务从而实现多任务执行。例如,我们将/etc下的文件和目录进行备份,同时不需要等待
[[email protected] ~]# tar -zpc -f /app/etc.tar.gz /etc/* & [1] 2948 # 2948代表PID [[email protected] ~]# tar: Removing leading `/' from member names # 一段时间之后,出现如下信息代表该任务完成 [1]+ Done tar -zpc -f /app/etc.tar.gz /etc/*
这里会有一个问题,如果对于那些会有显示结果的命令,例如ping命令,使用&之后,终端会一直显示ping命令的返回结果,这时候因为已经是后台进程,用ctrl+c也不起作用,我们怎么办呢,我们可以用数据重定向,例如:
ping 172.18.0.1 > /tmp/txt 2>&1 &
查看后台工作状态(jobs)
如果想知道有多少进程在后台工作,可以利用jobs命令查看,下图为我的系统现在后台工作的进程,显示结果表示了后天进程的工作状态等信息,注意前边的+ -号,他们具有一定的含义,他们代表fg取用的顺序。
jobs -l # 列出后台进程的详细信息,包括PID
-r # 仅列出正在运行的后台进程
-s # 仅列出暂停的后台进程
将后台进程转为前台进程(fg)
我们想让后台进程转到前台来运行,可以使用fg命令。
fg # 默认将jobs命令显示结果中带 + 的转到前台
- # 将带 - 的转到前台
%NUM # 将jobs显示结果中指定的数字的进程转到前台
后台进程Stopped转为Running(bg)
下图中,我输入命令 /bin/ping 172.18.0.1 > /tmp/txt ,回车之后按下ctrl+z暂停该命令, ping命令的进程处于Stopped状态,使用bg之后,变为Running状态。
bg # 针对默认将jobs命令显示结果中带 + 的进程
- # 针对带 - 的进程
%NUM # 针对jobs显示结果中指定的数字的进程
杀死后台进程(kill)
kill命令直接将后台进程粗暴地终止移除,不够这个命令有点特别,需要指定讯号来进行处理,我们先来看一下kill命令的用法:
kill -l # 查看能够使用的signal,之后可以man 7 signal查看具体的效果
kill -signal %NUM | PID # kill命令的格式,%NUM为jobs命令显示结果中的第一列数字
先介绍几种常用的signal
kill -1 # 重新读取一次配置参数的文件
kill -2 # 等同于ctrl+c
kill -9 # 强制删除一个进程,例如,对于vim编辑文件file,不会主动删除.file.swp
kill -15 # 正常终止一个进程,例如,对于vim,主动删除.file.swp
ps命令
ps 显示进程的运行状况
ps -l # 仅显示当前bash下的进程状况
ps -lA # 显示系统所有进程的信息,每一列字段代表的意义如下
F | 进程的旗标(flag),为总结权限,4代表权限为root,1代表该子程序仅进行了复制 |
S | 运行状态(stat),R=>运行,S=>睡眠,D=>堵塞,T=>停止状态,Z=>僵尸状态,已经终止但是无法移除内存 |
UID/PID/PPID | 进程的发起人/进程号/父进程号 |
C | CPU使用率,单位百分比 |
PRI/NI | priority/nice优先级 |
ADDR/SZ/WCHAN | ADDR代表进程在内存的那个部分,- 代表正在运行状态;SZ代表进程所占内存大小;WCHAN代表进程是否在运行,- 表示正在运行 |
TTY | 登陆者的终端机位置,若为远程登录则为pts/n |
TIME | CPU运行该进程所费的时间 |
CMD | 该进程是什么指令触发的 |
ps aux # 不带-,显示系统所有的进程信息,每一列字段代表的意义如下
USER | 进程的发起人 |
PID | 进程号 |
%CPU | 进程占用CPU百分比 |
%MEM | 进程占用物理内存百分比 |
VSZ/RSS | 进程占用虚拟内存的大小/进程占用的固定内存的大小,可以理解为页的数量 |
TTY |
控制终端的ID,?代表与终端无关的进程,tty1-tty6为本机登录终端,pts/n为远程登录终端 |
STAT | 进程状态 |
START/TIME | 进程启动的时间/进程实际占用CPU的时间 |
COMMAND | 触发进程的指令,如果后边跟了<defunct>,表示这是一个僵尸进程 |
ps axjf # 同样不带 - ,进程之间具有相关性,该命令可以用类似程序树的形式显示进程信息
看图中一段的显示内容,我们可以看出,当前我是用sshd提供远程网络服务远程登录主机,该程序(父进程)提供一个bash环境(子进程),我在这个bash环境(父进程)下输入命令ps axjf触发了一个新的进程(子进程)。
Priority和nice优先级
linux会给予进程一个执行优先级priority(PRI),值越低优先级越高,PRI是系统核心动态控制调整,用户无法进行更改,那么我们如果想调整进程的优先级,而PRI又不能调整,我们引进了nice(NI)来使得用户可以手动修改进程的运行优先级别。
nice值的取值范围为-20--19,但是nice值的调整对用户也有限制,root可以随意调整自己和其他用户的nice值;普通用户只能调整自己的nece值,并且调整范围为0--19,防止nice为负值时抢占资源,同时nice值只能越调越高,不能降低nice值,PRI和NI具有一定的相关性:
PRI(new)=PRI(old)+NI
需要注意的是,从关系式来看,虽然NI可以影响进程的优先级,但是进程的优先级最终还要经过系统核心决定,所有我们不能简单的理解PRI+NI。
nice # 对新建立的进程设定nice值
格式:nice -n NUM COMMAND # NUM范围为-20--19
我们对vim命令设置nice值为5,原本预设的PRI值为bash的PRI(80),现在变为了85
renice # 重新调整已存在进程的nice值
格式:renice NUM PID # NUM范围为-20--19,如果超出这个范围,则自动调整为最近的-20或19
先查看进程bash的PRI和NI等信息,然后输入renice命令修改bash进程的NI,修改完之后发现PRI和NI发生变化,同时我们也发现子进程也继承了父进程的PRI和NI。
原文地址:http://blog.51cto.com/13570193/2086163