目录
父进程与子进程
守护进程Daemon
进程管理
查看进程
计划任务
Priority和nice优先级
一、父进程与子进程
子进程是父进程衍生出来的程序。举个大家经常使用的例子,我们每次登陆的shell,会触发一个进程,我们都是在这个shell下输入命令进行工作的,其实呢,你输入的命令也会触发一个新的进程,这个新的进程就是子进程,而一开始登陆的shell进程则为父进程。我们做一个小实验,我们在当前登陆shell下再登陆一个新的shell,然后输入一个命令,查看进程的状态信息。
PID是该进程的识别码,PPID是父进程的识别码。我们发现第一个bash的PID和第二个bash的PPID都是2446,ping命令的PPID和第二个bash的PID都是2660,说明bash下输入的命令都是当前bash的进程所产生的嘛。
二、守护进程Daemon(常驻内存)
在系统引导过程中就启动的进程,我们称之为守护进程(Daemon),Windows下叫服务,并且这类进程会持续的进行,提供系统稳定性和网络所必须的功能。
前台进程和后台进程的区别:
前台和后台的区分依据是控制终端界面,和终端交互的进程为前台进程,此类进程需要及时对终端做出响应,具有较高的优先级;而和终端不进行交互的进程为后台进程,此类进程不需要对终端做出响应,优先级较低。前台进程和后台进程可以进行切换,注意,同时后台进程也分为依附于终端的后台进程和不依附于终端的后台进程,对于那些完全不受终端控制的后台进程则不能切换到前台。
守护进程是后台进程的一种
进程 |
区分依据: 是否与终端进行交互 |
前台进程 | 与终端交互 | |
后台进程 |
不与终端交互 | 且依附于终端的后台进程(可以与前台进程进行切换) | ||
而不依附于终端的后台进程(例如守护进程) |
三、进程管理
通常在当前bash下执行一个任务,必须等待这个任务执行完毕后才能输入命令执行下一个任务,现在我们要进行文档复制、资料查询、软件安装等等多个任务同时工作,这就要用到进程管理的知识。
3.1 将任务转到后台(&)
直接在执行任务的命令后边加&,然后我们可以输入命令执行另一个任务从而实现多任务执行。例如,我们将/etc下的文件和目录进行备份,同时不需要等待
[root@CentOS6 ~]# tar -zpc -f /app/etc.tar.gz /etc/* & [1] 2948 # 2948代表PID [root@CentOS6 ~]# 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 &
3.2 查看后台工作状态(jobs)
如果想知道有多少进程在后台工作,可以利用jobs命令查看,下图为我的系统现在后台工作的进程,显示结果表示了后台进程的工作状态等信息,特别注意,jobs命令显示的依附于终端的后台进程,另一个注意的是前边的+ -号,他们具有一定的含义,他们代表fg取用的顺序。
jobs -l # 列出后台进程的详细信息,包括PID
-r # 仅列出正在运行的后台进程
-s # 仅列出暂停的后台进程
3.3 将后台进程转为前台进程(fg)
我们想让后台进程转到前台来运行,可以使用fg命令。
fg # 默认将jobs命令显示结果中带 + 的转到前台
- # 将带 - 的转到前台
%NUM # 将jobs显示结果中指定的数字的进程转到前台
3.4 后台进程Stopped转为Running(bg)
下图中,我输入命令 /bin/ping 172.18.0.1 > /tmp/txt ,回车之后按下ctrl+z暂停该命令, ping命令的进程处于Stopped状态,使用bg之后,变为Running状态。
bg # 针对默认将jobs命令显示结果中带 + 的进程
- # 针对带 - 的进程
%NUM # 针对jobs显示结果中指定的数字的进程
3.5 杀死后台进程(kill)
kill命令直接将后台进程粗暴地终止移除,不过这个命令有点特别,需要指定讯号来进行处理,我们先来看一下kill命令的用法:
kill -l # 查看能够使用的signal,之后可以man 7 signal查看具体的效果
kill -signal %NUM | PID # kill命令的格式,%NUM为jobs命令显示结果中的第一列数字
先介绍几种常用的signal
kill -0 # 无作为,可以用来单纯的判断进程是否可以运行
kill -1 # 强制进程重新读取配置参数的文件
kill -2 # 终止正在运行的进程,等同于ctrl+c
kill -9 # 强制删除一个进程,例如,对于vim编辑文件file,不会主动删除.file.swp
kill -15 # 正常终止一个进程,例如,对于vim,主动删除.file.swp
killall 进程名 # 根据进程名杀死父进程及其子进程,和上面的依据PID不一样
pkill -u 用户名 # 杀死指定用户运行的所有进程
pkill -t 终端名 # 杀死指定终端运行的所有进程
输入 pkill -u lisi 之后,ps aux 查看进程结果
3.6 将后台进程脱离终端
对于那些依附于终端的后台进程,如果把终端关闭之后,该终端的进程都将关闭,那么有什么解决这种问题的方法。
nohup command &> /dev/null
screen ; command
四、查看进程相关命令
4.1 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 |
触发进程的指令,如果后边跟了 |
ps axjf # 同样不带 - ,进程之间具有相关性,该命令可以用类似程序树的形式显示进程信息
看图中一段的显示内容,我们可以看出,当前我是用sshd提供远程网络服务远程登录主机,该程序(父进程)提供一个bash环境(子进程),我在这个bash环境(父进程)下输入命令ps axjf触发了一个新的进程(子进程)。
4.2 搜索进程(egrep)
pgrep -u UID/用户名 # 基于用户名搜索进程
-l# 显示进程名
[root@CentOS6 ~]# pgrep -l -u root # 注意这里的-u和用户名必须写一起
pgrep -t 终端名 # 基于终端名搜索进程
[root@CentOS6 ~]# pgrep -l -t pts/1
pgrep -P PID # 搜索进程的子进程
[root@CentOS6 ~]# service httpd status httpd (pid 2692) is running... [root@CentOS6 ~]# pgrep -l -P 2692 2695 httpd 2696 httpd 2697 httpd 2698 httpd 2699 httpd 2700 httpd 2701 httpd 2702 httpd [root@CentOS6 ~]#
pidof 进程名 # 查询进程名的PID(包括子进程)
[root@CentOS6 ~]# pidof httpd 2702 2701 2700 2699 2698 2697 2696 2695 2692
4.3 系统工具
uptime 打印系统总共运行了多长时间和系统的平均负载,特定时间间隔内系统运行队列中的平均进程数叫做平均负载
对于一个双核CPU的话,当平均负载达到6的时候,说明CPU已经充分利用
[root@CentOS6 ~]# uptime
09:49:42 |up 30 min,| 2 users,| load average: 0.00, 0.00, 0.00
-----------------------------------------------------------------
当前时间 | 运行时间 | 连接用户 | 1、5、10分钟的平均负载
[root@CentOS6 ~]# uptime 09:49:42 up 30 min, 2 users, load average: 0.00, 0.00, 0.00 [root@CentOS6 ~]# dd if=/dev/zero of=/dev/null & # 通过无限写入操作,观察系统的负载 [1] 2779 [root@CentOS6 ~]# uptime 09:55:52 up 36 min, 2 users, load average: 0.15, 0.03, 0.01 [root@CentOS6 ~]# uptime 09:55:53 up 36 min, 2 users, load average: 0.15, 0.03, 0.01 [root@CentOS6 ~]# uptime 09:55:55 up 36 min, 2 users, load average: 0.15, 0.03, 0.01 [root@CentOS6 ~]# uptime 09:55:55 up 36 min, 2 users, load average: 0.15, 0.03, 0.01 [root@CentOS6 ~]# uptime 09:55:56 up 37 min, 2 users, load average: 0.15, 0.03, 0.01 [root@CentOS6 ~]# uptime 09:55:57 up 37 min, 2 users, load average: 0.22, 0.05, 0.02 # 负载发生变化 [root@CentOS6 ~]# uptime 09:55:57 up 37 min, 2 users, load average: 0.22, 0.05, 0.02 [root@CentOS6 ~]# uptime 09:55:58 up 37 min, 2 users, load average: 0.22, 0.05, 0.02
动态监控进程状况(top)
top -d NUM # 指定刷新时间间隔,默认3s
top -b # 显示所有进程
top -n NUM # 刷新多少次后退出
top命令有许多内置命令,可以改变top命令的显示效果
排序
P 根据CPU百分比,默认
M 根据内存百分比
T 根据CPU运行时间
首部信息显示(如下)# 执行相应内置命令会使得对应行内容显示或消失
top - 10:09:11 up 50 min, 2 users, load average: 0.00, 0.00, 0.00 ==> l(字母) Tasks: 147 total, 1 running, 146 sleeping, 0 stopped, 0 zombie ==> t 同时改变Tasks和Cpu Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st ==> 1(数字) Cpu1 : 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 2038352k total, 236156k used, 1802196k free, 24860k buffers ==> m 改变Mem和Swap Swap: 4194300k total, 0k used, 4194300k free, 65400k cached
退出top :q
修改刷新时间间隔:s + 间隔时间(单位S)
杀死指定进程:k + PID
保存至文件:W(大写) # 保存至/root/.toprc文件中
htop # 该命令需要从epel源安装,提供更多top没有的功能
安装过程:
配置epel源
1 [mage-epel]
2 name=mage-epel
3 baseurl=http://172.18.0.1/fedora-epel/6/x86_64/
4 gpgcheck=0
yum search htop,发现存在htop的软件包
yum -y install htop
htop命令显示效果如下:
五、计划任务
计划任务可以让系统在未来某个时间执行命令。
5.1 at
at命令只是临时的计划任务,在成功一次之后就会失效。这是一个依赖于atd服务的命令,如果该服务停止,则该命令不会生效。另外,在制定了计划任务之后,即使重启系统,该计划任务还是有效的,因为系统把at计划任务写入到了硬盘中。对应的相关目录是/var/spool/at,如下图:
用法:
at HH:MM [YYYY-MM-DD] 自定义任务 ctrl d ******************************* 或者 echo 内容 | at HH:MM [YYYY-MM-DD] ******************************* 或者 at HH:MM [YYYY-MM-DD] << EOF 内容 EOF ******************************* 或者 编辑文件内容 at HH:MM [YYYY-MM-DD] -f 文件名
制定at计划任务的时间
at 设置的时间如果和当前时间冲突,则系统自动判定为第二天的这个时间
at noon # 表示12:00
at midnight # 表示00:00
at teatime # 表示16:00
at now+n{minutes,years,days,weeks} # 表示指定多长时间之后
at命令的选项
at -V # 显示版本信息
at -l # 显示计划任务,等同于命令atq
at -c n # 查看指定计划任务的详细信息,等同于命令atrm
at -d n # 删除指定计划任务
at -m # 当到了指定时间后,无论任务执行正确与否,都将会发送邮件给用户
限制用户使用at制定计划任务
/etc/at.deny 禁止使用at的用户名单
/etc/at.allow 语序使用at的用户名单
当/etc/at.allow存在时,/etc/at.deny失效。当/etc/at.allow和/etc/at.deny都不存在时,只有root才能使用at。
5.2 cron
cron是周期性的计划任务,依赖于crond服务,不过cron计划任务需要直接对文件进行修改才能实现,这个文件就是/etc/crontab
/etc/crontab内容如下:
时间表示法:
①特定值
②* 表示取值范围内的所有值
③N,N,N 表示离散取值
④N-N 表示连续取值
⑤/N 表示在范围内的步长
六、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。