1、进程概述

程序:安装包,程序代码,app,存放在磁盘里

进程:运行起来的程序、命令、服务(远程连接服务、网络服务)都可以称作进行,运行在内存中

守护进程:一直运行的进程,也叫作服务

进程相关信息在/proc/目录中:

可以到以数字命名的目录,这个数字就是进程的pid号

进程的基本信息:

进程的id:pid
父子关系:父进程与子进程(通过pstree命令可以查看,该命令属于psmisc软件包)

查看如下:

[root@linux-87-01 ~]# pstree -p
systemd(1)─┬─NetworkManager(1010)─┬─{NetworkManager}(1055)
           │                      └─{NetworkManager}(1057)
           ├─VGAuthService(1021)
           ├─abrt-watch-log(1008)
           ├─abrtd(1004)
           ├─agetty(1283)
           ├─auditd(940)───{auditd}(941)
           ├─chronyd(1027)
           ├─crond(1024)
           ├─dbus-daemon(1005)
           ├─lvmetad(511)
           ├─master(1374)─┬─pickup(1375)
           │              └─qmgr(1376)
           ├─polkitd(1011)─┬─{polkitd}(1045)
           │               ├─{polkitd}(1048)

特殊进程:僵尸进程、孤儿进程

2、进程的分类(异常进程)

2.1 僵尸进程

僵尸进程是当子进程比父进程先结束,而父进程没有回收子进程、释放子进程占用的资源,此时子进程将成为一个僵尸进程。

僵尸进程:由于各种原因导致某个进程挂掉了,但是进程本身依然存在,还占用着系统资源,这种异常进程叫作僵尸进程。

查找:通过ps aux命令找出Z状态的进程,该进程就是僵尸进程。也可通过top命令查看

解决:

方案1:找到僵尸进程的上级进程,结束进程即可

方案2:如果上级进程是主进程(pid为1进程),则需要重启系统

top命令结果的zombie为僵尸进程个数:

ps aux中STAT列为进程状态(Z就是僵尸进程)

僵尸进程演示:

#1、创建一个名为zombine.c的文件(C语言编写),内容如下:
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/*
 *   desc: 用于模拟僵尸进程.代码. oldboyedu.com
 *   
*/
int main(int argc, char *argv[])
{
pid_t pid;
pid = fork();
if (pid == 0) {
int iPid = (int)getpid();
fprintf(stderr,"I am child,%d\n",iPid);
sleep(1);
fprintf(stderr, "Child exits\n");
return EXIT_SUCCESS;
}
int iPid = (int)getpid();
fprintf(stderr,"I am parent,%d\n",iPid);
fprintf(stderr, "sleep....\n");
sleep(600);
fprintf(stderr, "parent exits\n");
return EXIT_SUCCESS;
}
# 2、编译该文件
[root@linux-87-01 ~]# gcc zombine.c -o zombine
# 3、运行zombine
[root@linux-87-01 ~]# ./zombine 
I am parent,1723
sleep....
I am child,1724
Child exits

另外打开一个窗口,用top命令查看:

此时有1个僵尸进程。

ps aux可以查看具体进程。僵尸进程为zombine,pid为1724

结束进程:kill pid 或 kill -9 pid

[root@linux-87-01 ~]# kill 1724

发现,无法结束:

找到该僵尸进程的上级进程,结束上级进程。

通过查询得知,上级进程为1723,所以结束该进程:

[root@linux-87-01 ~]# kill 1723
[root@linux-87-01 ~]# ps aux | grep 'Z'
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       1756  0.0  0.0 112808   948 pts/1    R+   23:16   0:00 grep --color=auto Z
[root@linux-87-01 ~]# 

此时,已经没有僵尸进程了。

2.2 孤儿进程

孤儿进程指的是在其父进程执行完成或终止后仍继续运行的一类进程,

孤儿进程会被系统直接接管(systemd进程)

3、进程监控指令

Linux系统中常用的进程监控指令:ps、top等

ps:静态,process,查看当前瞬间进程状态,一般用于临时检查或取值。主要用于查看PID,进程是否存在,进程状态。

top:动态、交互、整体查看系统状态、负载、僵尸进程、cpu、内存等信息,类似于Windows的任务管理器。主要用于查看系统cpu、内存、僵尸进程、负载情况等信息

3. 1 ps命令详解

a)概述

ps  -ef 命令运行结果
    UID:进程属于的用户
    PID:进程id号,大部分是随机的
    PPID:父进程的id号,pstree -p可查看详细关系
    CMD:进程名字

如下:

b)ps aux

ps aux比ps -ef多了一些内容,如,cpu使用率、内存使用率、占用内存大小、进程状态。

ps aux每一列含义:

第1列:USER,进程属于用户
第2列:PID,进程号(子进程号)
第3列:%CPU,进程占用cpu百分比
第4列:%MEM,进程占用内存百分比
第5列:VSZ,占用虚拟内存大小(KB)
第6列:RSS,占用物理内存大小(KB)
第7列:TTY,用户终端(用户连接进来后,系统创建)
第8列:STAT,进程状态
第9列:START,进程启动时间,即该进程是什么时候启动的
第10列:TIME,进程占用CPU多长时间
第11列:COMMAND,进程名称(命令,选项....)。[]括起来的是内核进程,其他的是系统进程。systemd的pid是1,也就是第1个进程
3.2 进程状态详解

进程状态:进程运行中、僵尸进程、正在进程io的进程、前台或后台运行进程。

进程状态:基本状态+附加组成

STAT基本状态:

R:running,进程正在运行
S:可中断进程(可以随时停止)
T:terminate,进程被暂停(挂起),ctrl+z
D:不可中断进程(进程正在进程io读写)
Z:zombie,僵尸进程

STAT状态+符号(附件状态):

s:进程是控制进程,Ss进程的领到者,父进程/主进程
<:进程运行在高优先级上,S<优先级较高的进程
N:进程运行在低优先级上,SN优先级较低的进程
+:当前进程运行在前台,R+表示进程在前台运行
l:小写的L,进程是多线程的,Sl表示进程是以多线程方式运行(与程序)
   使用多线程可以让服务或软件支持更好的访问,但是需要软件支持

常见进程状态:

R+:前台运行中的进程

R:后台运行进程

S:可中断进程(大部分的进程)

T:后台挂起的进程

D:不可终端进程(io进程)

Ss:可中断进程(普通)的管理进程

S<:可中断的高优先级进程

Ssl:可中断的多线程的管理进程

Z:僵尸进程

3.3 top命令

top命令默认是个交互式的命令,可以展示系统负载信息、进程信息、cpu、内存等。类似于Windows任务管理器

top命令运行结果如下:

前5行参数解释:

系统整体状态:

第一行:w/uptime

up 2:05,开机多长时间

3 users:用户登录数,具体用户可以使用w、uptime命令查看

load average:平均负载,分别是1分钟、5分钟、15分钟。

第二行:进程汇总信息

103 total:共有103个进程

1 running:1个运行中(R)的进程

102 sleeping:102个休眠(S、Ss)进程

0 stopped:0个挂起(T)进程

0 zombie:0个僵尸进程

CPU信息:

第三行:cpu使用率

0.0 us:user cpu,用户cpu

0.0 sy:system cpu,系统cpu

0.0 ni:高优先级(nice)

100.0 id:idle,空闲进程

0.0 wa:io wait,iO等待

0.0 hi:硬中断

0.0 si:软中断

0.0 st:steal,虚拟机

free -h:

第4行:内存使用情况

2507100 total:总内存

1785580 free:可用内存

232188 used:已用内存

489332 buff/cache:缓存/缓冲占用内存

第5行:swap使用情况(Linux内存不足时临时充当内存使用)

2097148 total:总swap

2097148 free:可用swap

0 used:已用swap

2114848 avail Mem:当前可用内存

3.4 案例

案例1:过滤出crond进程信息

一般用于检查某个服务或进程是否运行中

[root@linux-87-01 ~]# ps -ef | grep crond
[root@linux-87-01 ~]# ps -aux | grep crond

过滤的结果可以使用-v参数取反,比如,查看除了crond之外的进程:

[root@linux-87-01 ~]# ps -ef | grep -v  crond

也可与wc命令使用:

[root@linux-87-01 ~]# ps -ef | grep crond | grep -v grep | wc -l

案例2:按照树形结构查看进程信息

一般用于查看进程关系

#pstree
#pstree  -p 显示树形结构并输出pid
ps  auxf  #也可以展示部分所属关系,但没有pstree直观

案例3:根据要求只显示出某些内容

根据要求取出ps命令结果中部分内容

#取出第1列
[root@linux-87-01 ~]# ps aux | awk '{print $1}'
#取出第1、3列
[root@linux-87-01 ~]# ps aux | awk '{print $1,$3}'
#输出指定内容,如只看user,%CPU
[root@linux-87-01 ~]# ps axo user,%CPU

不显示标题:

#awk,排除第1行,从第2行开始
[root@linux-87-01 ~]# ps aux | awk 'NR>1{print $1,$3}'

awk:

awk '{print 列}'
awk '条件{print 列}'

NR>1:行号大于1

NR>=2:行号大于等于2

ps命令不输出第一行:

[root@linux-87-01 ~]# ps --no-heading  axo user,%CPU

案例4:取出某个服务(crond)的进程信息(pid,%cpu,%mem)

1、第1个命令输出

2、定位行(grep、awk)

3、通过awk取列

#方法1
[root@linux-87-01 ~]# ps aux | grep 'crond' | grep  -v grep | awk '{print $2,$3,$4}'

#方法2
[root@linux-87-01 ~]# ps --no-heading o pid,%cpu,%mem -C crond
 --no-heading:不输出第1行
 o:字母o,指定要输出的哪些内容
 -C:指定哪个服务

awk最后的列:

#取出最后1列
[root@linux-87-01 ~]# echo "a b c d" | awk '{print $NF}'
d
#取出倒数第2列
[root@linux-87-01 ~]# echo "a b c d" | awk '{print $NF-1}'
-1
#显然结果不正确,应该写成:
[root@linux-87-01 ~]# echo "a b c d" | awk '{print $(NF-1)}'
c

案例5:取出所有进程中内存使用率最高的前5

#使用sort+ps
[root@linux-87-01 ~]# ps --no-heading aux | sort -rnk4 | head -5
#只使用ps
[root@linux-87-01 ~]# ps --no-heading aux --sort=-%mem | head -5

案例6:top基础使用与快捷键

#1、基础用法
q:退出
默认每3秒刷新一次
默认按%cpu排序,按大写M则按内存排序,按P则按cpu排序

#进阶用法:
输入z,进入颜色模式,按x标记出当前是按照哪列排序
shift + >  :向右
shift + <  :向左

#top命令升级版,支持鼠标操作
htop
系统默认没有,yum  install -y htop

htop运行如下:

案例7:过滤出僵尸进程数量

top命令是一个交互式命令,默认每3秒更新一次数据。

如何显示1次数据?

使用参数:-bn 1 ,注意不能写成-nb 1

-b :非交互式

-n:只输出1次结果

[root@linux-87-01 ~]# top -bn 1 | awk 'NR==2{print $(NF-1)}'

4、系统负载

1、概述

负载:衡量系统繁忙程度的指标

load average:平均负载,最近1分钟、5分钟、15分钟系统平均负载

衡量是否繁忙:数值越接近cpu核心总数,系统的负载越高

预警:建议负载达到cpu核心总数的70-80%

查看CPU核心数:lscpu,结果中参数:CPU(s)为cpu核心总数

负载原理:平均负载是指单位时间内,系统处于可运行状态(R、S)和不可中断状态(D)的平均进程数,也就是平均活跃进程数。

负载是衡量正在运行的进程的平均数(可中断进程和不可中断进程)

负载主要衡量的是可运行状态(R、S占cpu)和不可中断(io)

查看负载的命令:w、top、uptime、查看/proc/loadavg文件

2、负载高?

排查流程:

1)通过监控软件发现系统负载高(w、lscpu查看)

2)判断是cpu还是io导致负载高

3)如果是cpu导致,可以使用ps aux、top、htop命令查看占用cpu情况(us、py指标)

如果是io导致,top结果中的wa参数,再用iotop -o命令查看正在进行读写的进程

模拟io负载高:

#使用dd命名,创建一个大文件,进行占用io
[root@linux-87-01 ~]# dd if=/dev/zero  of=/tmp/big  bs=1M  count=10000

if:input  file,输入文件,固定/dev/zero
of:output  file,输出文件(你要创建的文件)
bs:block size,每次读取的大小,一般用1M即可
count:次数,bs*count就是文件大小。

通过top查看,

80.0 wa:也就是io导致负载高

通过iotop命令查看:

是dd操作导致负载高。

5、后台管理

命令在后台运行:命令 &

例如:

如何区分前台、后台程序:进程状态查看,带+表示前台运行的进程。

前台运行:需要连接后进行运行或操作,连接断开这个命令,操作就自动结束。

后台运行:让软件进入系统的后台,持续运行,一般情况下,连接断开了也不会影响软件运行。

软件后台运行方法

1、命令  &               常用的后台运行方法
2、nohup  命令  &        与方法1类似,会记录输出到文件中默认叫nohup.out
3、先运行命令,然后按下ctrl + z(后台挂起),恢复使用fg    软件进入后台     顽固软件可以通过ctrl  + c 结束它
4、screen  命令      通过软件创建空间,让命令在这个空间运行

fg:foreground,前台运行

bg:background,后台运行

案例1:让sleep 999 命令后台运行

[root@linux-87-01 ~]# sleep 999  &
[1] 1657
[root@linux-87-01 ~]# ps aux | grep 1657
root       1657  0.0  0.0 108052   356 pts/0    S    23:02   0:00 sleep 999
root       1659  0.0  0.0 112808   964 pts/0    R+   23:02   0:00 grep --color=auto1657
[root@linux-87-01 ~]# 

说明:

[1] 1657
[1]中的1,表示手动进入到后台运行的第1个进程
1657:表示进程的pid

使用jobs命令,可以查看手动进入后台运行的进程

[root@linux-87-01 ~]# jobs
[1]+  Running                 sleep 999 &
[root@linux-87-01 ~]# 

6、结束进程三剑客

3个用于结束进程的命令:

kill +  进程pid:结束进程,该方法比较常用
pkill + 进程名称:属于模糊查找进程,然后结束
killall + 进程名称:属于精确查找结束进程

kill信号

kill  pid  默认发送结束信号
kill  -9 pid  发送强制结束信号。不要使用kill  -9 来结束数据库
分类: Linux系统基础