本章内容

进程概述和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创建子进程,如果子进程退出,而父进程并没有调用waitwaitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程成为僵尸进程

进程的属性
  • 进程ID(PID):是唯一的数值,用来区分进程
  • 父进程的ID(PPID)
  • 启动进程的用户ID(UID)和所属组的(GID)
  • 进程状态:状态分为运行R、休眠S、僵尸Z
  • 进程执行的优先级
  • 进程所连接的终端名
  • 进程资源占用:比如占用资源大小(内存、CPU占用量)
使用ps查看进程工具

1、ps查看进程工具

例1:常用的参数

  • a:显示跟当前终端关联的所有进程
  • u:基于用户的格式显示(U:显示某用户ID所有的进程)
  • x:显示所有的进程,不以终端机来区分

例2:常用的选项组合是:

ps -aux

ps显示进程ノ  .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显示完整格式输出

例:

ps -efノ  .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

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

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% waCPU等待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)以树状图显示进程,只显示进程的名字,且相同进程合并显示

格式:pstreepstree -p

以树状图显示进程,还显示进程PID

如果没有pstree命令,yum安装:

yum install psmisc

例:

pstree -p | more

pstreeノ  .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

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挂起

级别5ノ  .assets/级别5.png)

查看vim的进程id

vim -aux | grep vim

查看idノ  .assets/查看id.png)

使用top命令查看优先级

top -p 1572

top 5ノ  .assets/top 5.png)

可以显示是优先级5,我们改回0

renice -0 1572

reniceノ  .assets/renice.png)

再次top查看

top 0ノ  .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

screen启动ノ  .assets/screen启动.png)

Screen将创建一个执行shell的全屏窗口,你可以执行任意shell程序,就像在ssh窗口中那样

想退出这个screen窗口但不后台继续执行命令,则使用命令exit:

exit

screen退出ノ  .assets/screen退出.png)

我们重现创建一个screen窗口,执行一个vim a.txt:

hello screenノ  .assets/hello screen.png)

假设这时候想离开一段时间,但还是想让这个命令继续运行

screen当前窗口按快捷键ctrl+a+d,分离出来独立的一个会话,可以使用screen -ls命令进行查看:

screen -lsノ  .assets/screen -ls.png)

想重新进入该会话,则screen -r +会话id:

screen -r 64511

重新进入screenノ  .assets/重新进入screen.png)

附:常用的screen参数

  • screen -S test 新建一个叫做test的会话
  • screen -ls 列出当前所有的会话
  • screen -r test 回到test会话
最后修改:2023 年 05 月 10 日
如果觉得我的文章对你有用,请随意赞赏