本章内容
进程概述和ps
查看进程工具
uptime
查看系统负载-top
动态管理进程
前后台进程切换-nice
进程优先级-free-
实战screen
后台执行命令
进程概述和PS管理进程
什么是进程?
进程是已启动的可执行程序的运行实例,进程有一下组成部分
- 已分配内存的地址空间
- 安全属性,包括所有权凭据和特权
- 程序代码的一个或多个执行线程
- 进程状态
程序:二进制文件,静态/bin/date
usr/sbin/sshd
进程:是程序运行的过程,动态,有生命周期及运行状态
ノ .assets/进程.png)
描述如下:
父进程复制自己的地址空间(fork分叉)创建一个新的(子)进程结构,每个新进程分配一个唯一的进程ID(PID),满足跟踪安全性之需,PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代
Centos5或6PID为1的进程是:init
Centos7PID为1的进程是:systemd
僵尸进程:一个进程使用fork
创建子进程,如果子进程退出,而父进程并没有调用wait
和waitpid
获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程成为僵尸进程
进程的属性
- 进程ID(PID):是唯一的数值,用来区分进程
- 父进程的ID(PPID)
- 启动进程的用户ID(UID)和所属组的(GID)
- 进程状态:状态分为运行R、休眠S、僵尸Z
- 进程执行的优先级
- 进程所连接的终端名
- 进程资源占用:比如占用资源大小(内存、CPU占用量)
使用ps
查看进程工具
1、ps
查看进程工具
例1:常用的参数
a
:显示跟当前终端关联的所有进程u
:基于用户的格式显示(U:显示某用户ID所有的进程)x
:显示所有的进程,不以终端机来区分
例2:常用的选项组合是:
ps -aux
ノ .assets/ps显示进程.png)
注:使用方括号括起来的进程是内核态的进程,没有括起来的是用户态进程
上面的参数输出每列含义:
USER
:启动这些进程的用户PID
:进程的ID%CPU
:进程占用的CPU百分比%MEM
:占用内存的百分比VSZ
:进程占用的虚拟内存大小(单位:KB)RSS
:进程占用的物理内存大小(单位:KB)STAT
:该进程目前的状态,Linux进程有5种基本状态:R
:该程序目前正在运作,或者是可被运作S
:该程序目前正在睡眠当中(可以是idle
状态),但可被某些讯号(signal)唤醒T
:该程序目前正在侦查或者是停止了Z
:该程序应该已经终止,但是其父程序却无法正常的终止它,造成zombie
(僵尸)程序的状态D
:不可中断状态5个基本状态后,还可以加一些字母,比如:
R+
Ss+
如下图:- ノ .assets/其他状态.png)
它们的含义如下:
<
:表示进程运行在高优先级上N
:表示进程运行在低优先级上L
:表示进程有页面锁定在内存中s
:表示进程是控制进程l
:表示进程是多线程的+
:表示当前进程运行在前台
START
:该process
被触发启动的时间TIME
:该process
实际使用CPU
运作的时间COMMAND
:该程序的实际指令
例1:查看a.txt
进程状态
在一个终端执行vim a.txt
,然后查看进程状态:
[root@master ~]# ps -aux | grep a.txt
root 1544 0.0 0.0 112812 984 pts/0 S+ 10:28 0:00 grep --color=auto a.txt
注:状态S
表示睡嘛状态+
表示前台
在vim a.txt
这个终端上按下:ctrl+z
再查看a.txt
状态:
[root@master ~]# vim a.txt
[1]+ Stopped vim a.txt
[root@master ~]# ps -aux | grep a.txt
root 1545 0.2 0.2 149512 5288 pts/0 T 10:28 0:00 vim a.txt
root 1547 0.0 0.0 112812 980 pts/0 S+ 10:28 0:00 grep --color=auto a.txt
注:查看状态T
表示停止状态
ctrl+c
是发送SGIINT
信号,终止一个进程ctrl+z
是发送SIGSTOP
信号,挂起一个进程,将作业放置到后台(暂停)ctrl+d
不是发送信号,而是表示一个特殊的二进制值,表示EOF
,代表输入完成或者注销
例2:D
不可中断状态
在一个终端进行打包操作,在另一个终端进行进程查看
tar -zcvf usr-tar.gz /usr/
ps -aux | grep tar
可以在另一个终端查看到状态,由S+
---R+
---D
ps
常用的参数:
-e
显示所有的进程-f
显示完整格式输出
例:
ノ .assets/ps -ef.png)
包含的信息如下:
- UID:启动这些进程的用户
- PID:进程的ID
- PPID:父进程的进程号
- C:进程生命周期中的CPU利用率
- STIME:进程启动时的系统时间
- TTY:表明进程在哪个终端设备上运行,如果显示
?
表示与终端无关,这种进程一般是内核态进程,另外,tty-tty6
是本机上面的登入者程序,若为pts/0
等,则表示运行在虚拟终端上的进程 - TIME:运行进程需要的累计CPU时间
- CMD:启动的程序名称
注释:
ps -aux
是用BSD
的格式来显示进程
ps -ef
是用标准的格式来显示进程
uptime查看系统负载-top动态管理进程
uptime查看CPU负载工具
命令:
uptime
ノ .assets/uptime.png)
弹出消息含义如下:
13:22:30 | 当前时间 |
---|---|
up 20days | 系统运行时间,说明此服务器连续运行20天了 |
2 user | 当前登录用户数 |
load average:0.06 0.60 0.48 | 系统负载,即任务队列的平均长度,三个数值分别为1分钟,5分钟,15分钟前到现在的平均值 |
例1:找出当前系统中,CPU负载过高的服务器
- 服务器1:load average:0.15 0.08 0.01 1核
- 服务器2:load average:4.15 6.08 6.01 1核
- 服务器3:load average:10.15 10.08 10.01 4核
答案:服务器2
如果服务器的CPU为1核心,则load average中的数字>=3,则负载过高,如果服务器的CPU的4核心,则load average中的数字>=12,则负载过高
经验:单核心,1分钟的系统平均负载不要超过3,就可以了
top命令
命令:
top
ノ .assets/top.png)
第一行内容与uptime弹出的信息一样
进程和CPU的信息(第二、三行)
当有多个CPU时,这些内容可能会超过两行,内容如下:
Tasks:481 total | 进程总数 |
---|---|
1 running | 正在运行的进程数 |
480 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
CPU(s):0.0% us | 系统用户进程使用CPU百分比 |
0.0% sy | 内核中的进程占用CPU百分比 |
0.0% ni | 用户进程空间内改变过优先级的进程占用CPU百分比 |
98.7% id | 空闲CPU百分比 |
0.0% wa | CPU等待I/O完成的时间总量 |
0.0% hi(了解)硬中断消耗时间 | 硬中断,占的CPU百分比,1.硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等,每个设备或设备集都有它自己的IRQ(中断请求),基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)英语解释:hi -> Hardware IRQ:The amount of time the CPU has been servicing hardware interrupts |
0.0% si(了解)软中断消耗时间 | 软中断,占的CPU百分比,1.通常,软中断时一些对I/O的请求,这些请求会调用内核中可以调度I/O发生的程序,对于某些设备,I/O请求需要被立即处理,而磁盘I/O请求通常可以与排队并且可以稍后处理,根据I/O模型的不同,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另一个进程去运行,I/O可以在进程之间产生并且调度过程通常和磁盘I/O的方式是相同.英语解释:si ->Software Interrupts:The amount of time the CPU has been servicing software |
0.0 st(steal偷) | 虚拟机偷取物理机的时间,比如:物理机已经运行了KVM,XEN虚拟机,KVM虚拟机占用物理机的CPU时间 |
wa测试:
终端1:执行:top
top
终端2:
dd if=/dev/zero of=/a.txt count=10 bs=100M
终端3:
dd if=/dev/zero of=/a.txt count=10 bs=100M
注:两个dd进程对磁盘进行大量写时,发现IO等待会占用很多CPU,如果wa占用比较对CPU,原因是磁盘性能有问题,建议换磁盘
内存信息(第四五行)
内容如下:
Mem:2033552 total | 物理内存总量 |
---|---|
340392k used | 使用的物理内存总量 |
1376636k free | 空闲内存总量 |
31624k buff/cache | 用作内存核缓存的内存量和free -k 一个意思 |
Swap:2017948k total | 交换区总量 |
0k used | 使用的交换区总量 |
192772k free | 空闲交换区总量 |
1518148 avail Mem | 总的可利用内存是多少 |
注:如果swap分区被使用,则内存不够用了
top快捷键:
- 默认3S刷新一次,按s修改刷新时间
- 按空格:立即刷新
- q退出
- P:按CPU排序
- M:按内存排序
- T:按时间排序
- 数字键1:显示每个内核的CPU使用率
- u/U:指定显示的用户
- h:帮助
- p:+进程ID,查看某个进程状态
例1:使用TOP动态查看某个或某些进程的信息,找到进程ID
ps -aux | grep vim
top -p 1559
例2:找出系统中使用CPU最多的进程
运行top,按大写的P即可
top
lsof命令
lsof命令用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP UDP)
-i
<条件>:列出符合条件的进程(4、6、协议、:端口、@ip)
例:用于查看端口,或查看开启的后门端口是哪个进程在使用
lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 998 root 3u IPv4 19097 0t0 TCP *:ssh (LISTEN)
sshd 998 root 4u IPv6 19099 0t0 TCP *:ssh (LISTEN)
sshd 1523 root 3u IPv4 23568 0t0 TCP master:ssh->192.168.153.100:56114 (ESTABLISHED)
-p
<进程号>:列出指定进程号所打开的文件
注:如果没有lsof
命令,执行:
yum install lsof
pstree工具使用
pstree:(display a tree of processed)
以树状图显示进程,只显示进程的名字,且相同进程合并显示
格式:pstree
或pstree -p
以树状图显示进程,还显示进程PID
如果没有pstree
命令,yum安装:
yum install psmisc
例:
pstree -p | more
ノ .assets/pstree.png)
前台进程切换-nice进程优先化-free-实战screen后台执行命令
Linux后台进程与前台进程的区别
前台进程:是在终端中运行的命令,那么该终端就成为进程的控制终端,一旦这个终端关闭,那么这个进程也随着消失
后台进程:也叫守护进程(Daemon),是运行在后台的一种特殊进程,不受终端控制,它不需要终端的交互,Linux的大多数服务器就是用守护进程实现的,比如,Web服务器httpd等
进程的前后与后台运行
跟系统任务相关的几个命令(了解)
& | 用在一个命令的最后,可以把这个命令放到后台执行 |
---|---|
ctrl+z | 将一个正在前台执行的命令放到后台,并且暂停 |
jobs | 查看当前有多少在后台进行的进程,它是一个作业控制命令 |
fg(foreground process) | 将后台中的命令调至前台继续运行,如果后台中有多个命令,可以用fg%jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid) |
bg(background process) | 将一个在后台暂停的命令,变成继续执行,如果后台中有多个命令,可以用bg%jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid) |
实战恢复被挂起的进程(了解)
例:
vim a.txt按下:ctrl+z
[root@master ~]# vim a.txt
[1]+ Stopped vim a.txt
命令查看vim状态:
[root@master ~]# ps -aux | grep vim
root 1552 0.0 0.2 149520 5268 pts/0 T 09:55 0:00 vim a.txt
root 1554 0.0 0.0 112812 972 pts/0 S+ 09:56 0:00 grep --color=auto vim
查看当前有多少在后台运行的进程
[root@master ~]# jobs
[1]+ Stopped vim a.txt
将后台挂起的进程恢复到前台运行
fg 1
kill关闭进程
关闭进程的3个命令
- kill kill+进程号 #关闭单个进程
- killall和pkill命令用于杀死指定名字的进程
通过信号的方式来控制进程,可以通过命令查看:
kill -l
ノ .assets/kill -l.png)
用的最多的是:9信号
信号编号 | 信号名 |
---|---|
(1)SIGHUP | 重新加载配置 |
(2)SIGINT | 键盘中断ctrl+c |
(3)SIGQUIT | 退出 |
(9)SIGKILL | 强制退出 |
(15)SIGTERM | 终止(正常结束),缺省信号 |
(18)SIGCONT | 继续 |
(19)SIGSTOP | 停止 |
(20)SIGTSTP | 暂停ctrl+z |
例1:kill与killall终止进程,关闭sshd
kill -9 2342
killall sshd
pkill sshd
进程的优先级管理
优先级取值范围为(-20,19),越小优先级越高,默认优先级是0
命令1:nice 指定程序的运行优先级
格式:nice n command
命令2:renice 改变程序的运行优先级
格式:renice -n pid
例1:指定运行vim的优先级为5
nice -n 5 vim a.txt
然后crtl+z挂起
ノ .assets/级别5.png)
查看vim的进程id
vim -aux | grep vim
ノ .assets/查看id.png)
使用top命令查看优先级
top -p 1572
ノ .assets/top 5.png)
可以显示是优先级5,我们改回0
renice -0 1572
ノ .assets/renice.png)
再次top查看
ノ .assets/top 0.png)
实战:使用screen后台实时执行命令备份(必会)
实战场景:公司晚上需要备份1T数据,不能再xshell上执行备份脚本back.sh
或直接运行back.sh &
放到后台运行,因为xshell长时间连接,如果本地网络偶尔断开或者xshell不小心关闭,都会让后台运行的备份命令停止运行,正确做法使用screen
screen概述和安装
Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH
链接窗口那样
安装screen
软件包:
yum install screen
screen使用方法
直接在命令行输入screen
命令回车,如下图:
screen
ノ .assets/screen启动.png)
Screen将创建一个执行shell的全屏窗口,你可以执行任意shell
程序,就像在ssh窗口中那样
想退出这个screen窗口但不后台继续执行命令,则使用命令exit
:
exit
ノ .assets/screen退出.png)
我们重现创建一个screen窗口,执行一个vim a.txt:
ノ .assets/hello screen.png)
假设这时候想离开一段时间,但还是想让这个命令继续运行
在screen
当前窗口按快捷键ctrl+a+d
,分离出来独立的一个会话,可以使用screen -ls
命令进行查看:
ノ .assets/screen -ls.png)
想重新进入该会话,则screen -r +会话id
:
screen -r 64511
ノ .assets/重新进入screen.png)
附:常用的screen参数
- screen -S test 新建一个叫做test的会话
- screen -ls 列出当前所有的会话
- screen -r test 回到test会话