进程管理
一、进程
名字 | 含义 | |
---|---|---|
程序 | 安装包,程序代码,app,存放在磁盘上面 | |
进程 | 运行起来的程序,命令,服务(远程连接服务,网络服务)都可以称作进程。运行在内存中 | |
守护进程 | 守护进程,一直运行的进程,也可以叫做服务 |
二、进程分类
1.僵尸进程 必会
由于谷中原因导致某个进程挂掉了,但是进程本身仍然存在,还占用着系统资源,这种异常进程叫做僵尸进程
查找:通过ps aux 过滤,Z状态即可找出僵尸进程或top命令查看
解决:
- 找出僵尸进程上级进程,结束进程即可
- 如果上级进程是主进程(pid为1的进程),则需要重启Linux系统
2.孤儿进程
孤儿进程指在其父进程执行完成或终止后,仍继续运行的一类进程
孤儿进程会被系统直接接管(systemd进程)
3.僵尸进程演示
#通过gcc生成僵尸进程的命令文件 E:\lnh\笔记\老师笔记\软件包\zombine.c
[root@lnh ~]# gcc zombine.c -o zombine
[root@lnh ~]# ll
total 16
-rwxr-xr-x 1 root root 8648 Dec 15 10:04 zombine
-rw-r--r-- 1 root root 591 Dec 15 09:56 zombine.c
#在另一个窗口运行僵尸进程
[root@lnh ~]# ./zombine
I am parent,2386
sleep....
I am child,2387
Child exits
#top命令查看是否有僵尸进程
[root@lnh ~]# top
top - 15:31:06 up 6:48, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 103 total, 1 running, 101 sleeping, 0 stopped, 1 zombie #显示有一个僵尸进程
#过滤出僵尸进程
[root@lnh ~]# ps aux |grep Z
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2387 0.0 0.0 0 0 pts/1 Z+ 15:30 0:00 [zombine] <defunct>
root 2390 0.0 0.0 112808 948 pts/0 R+ 15:31 0:00 grep --color=auto Z
#发现僵尸进程的pid是2387
#通过pstress 查看僵尸进程的父进程(也就是上级进程)
[root@lnh ~]# pstree -p |grep 2387
|-sshd(1356)-+-sshd(1952)---bash(1954)---zombine(2386)---zombine(2387)
#直接结束僵尸进程
[root@lnh ~]# kill 2387
[root@lnh ~]# top
top - 15:33:24 up 6:51, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 104 total, 1 running, 102 sleeping, 0 stopped, 1 zombie
#发现僵尸进程还在
#结束僵尸进程的父进程
[root@lnh ~]# kill 2386
[root@lnh ~]# top
top - 15:34:02 up 6:51, 2 users, load average: 0.00, 0.01, 0.05
Tasks: 102 total, 1 running, 101 sleeping, 0 stopped, 0 zombie
#发现僵尸进程没有了
提示: pstree属于psmisc软件包,yum安装psmisc即可
三、进程监控指令 必会
监控命令 | 含义 | |
---|---|---|
ps | 静态:ps 查看当时瞬间进程状态,一般用于临时检查或取值 | |
top | 动态:top动态,交互,整体查看系统状态,负载,僵尸进程,cpu,内存 |
1.ps命令格式
1.1 ps -ef
[root@lnh ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:42 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 08:42 ? 00:00:00 [kthreadd]
root 4 2 0 08:42 ? 00:00:00 [kworker/0:0H]
root 5 2 0 08:42 ? 00:00:00 [kworker/u256:0]
UID: 进程属于用户
PID: 进程id号,大部分是随机
PPID:父进程的id号,pstree -p 查看详细关系
CMD: 进程名字
1.2 ps aux
[root@lnh ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 125772 4256 ? Ss 08:42 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 08:42 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 08:42 0:00 [kworker/0:0H]
root 5 0.0 0.0 0 0 ? S 08:42 0:00 [kworker/u256:0]
列名 | 说明 | |
---|---|---|
第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个进程 |
1.3 进程状态
进程状态:进程运行中,僵尸进程,正在进行io的进程,前台或后台运行进程
组成:基本状态+附加状态
STAT基本状态 | 描述 | |
---|---|---|
R(running) | 进程运行 | |
S | 可中断进程(可以随时停止) | |
T(terminate) | 进程被暂停(挂起) ctrl+z | |
D | 不可中断进程(进程正在进行IO读写) | |
Z(zombie) | 僵尸进程,异常的进程 |
STAT 附加状态 了解 | 描述 | |
---|---|---|
s | 进程是控制进程,Ss进程的领导者,父进程/主进程 | |
< | 进程运行在高优先级上,S<优先级较高的进程 | |
N | 进程运行在低优先级上,SN优先级较低的进程 | |
+ | 当前进程运行在前台,R+ 表示进程在前台运行 | |
l | 进程是多线程的,Sl表示进程以线程的方式运行(与程序) 使用多线程可以让服务或软件支持更改的访问,但是需要软件支持 |
2.top命令格式
top - 15:06:53 up 23:05, 2 users, load average: 0.00, 0.01, 0.05
#当前时间 #开机多久 #登陆用户 #平均负载信息 1分钟 5分钟 15分钟
Tasks: 102 total, 1 running, 100 sleeping, 1 stopped, 0 zombie
#共102个进程 1个在运行 100个在休眠 1个挂起 0个僵尸
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
#用户CPU 系统CPU 高优先级 空闲进程 IO等待 硬中断 软中断 虚拟机
KiB Mem : 2027868 total, 1187728 free, 240148 used, 599992 buff/cache
# 总计内存 可用内存 已用内存 缓存占用内存
KiB Swap: 2097148 total, 2097148 free, 0 used. 1612744 avail Mem
# 总计swap 可用swap 已用swap 当前可用内存
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
#子进程id 用户 优先级 VSZ,RSS 占用共享内存 进程状态 cpu占用 内存占用 时间+命令
3.案例
3.1 过滤出crond进程信息 必会
[root@lnh ~]# ps -ef |grep crond
root 1093 1 0 08:42 ? 00:00:00 /usr/sbin/crond -n
root 2456 2365 0 16:39 pts/0 00:00:00 grep --color=auto crond
[root@lnh ~]# ps aux |grep crond
root 1093 0.0 0.0 126384 1604 ? Ss 08:42 0:00 /usr/sbin/crond -n
root 2458 0.0 0.0 112808 964 pts/0 R+ 16:39 0:00 grep --color=auto crond
#过滤的结果可以通过grep -v grep 排除下grep命令自己(进程)
[root@lnh ~]# ps aux |grep crond |grep -v grep
root 1093 0.0 0.0 126384 1604 ? Ss 08:42 0:00 /usr/sbin/crond -n
#与wc配合使用统计进程数量。
[root@lnh ~]# ps aux |grep crond |grep -v grep|wc -l
1
3.2 按照树形结构查看进程信息 必会
[root@lnh ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─abrt-watch-log
├─abrtd
├─agetty
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─sshd───bash
│ └─sshd───bash───pstree
[root@lnh ~]# pstree -p #显示树形结构并输出pid
systemd(1)─┬─NetworkManager(1086)─┬─{NetworkManager}(1142)
│ └─{NetworkManager}(1144)
├─VGAuthService(1051)
├─abrt-watch-log(1060)
├─abrtd(1054)
├─agetty(1365)
├─auditd(979)───{auditd}(981)
├─chronyd(1072)
├─crond(1093)
├─dbus-daemon(1061)
├─lvmetad(508)
├─master(1454)─┬─pickup(2352)
│ └─qmgr(1459)
├─polkitd(1050)─┬─{polkitd}(1084)
│ ├─{polkitd}(1090)
│ ├─{polkitd}(1092)
│ ├─{polkitd}(1094)
│ ├─{polkitd}(1102)
│ └─{polkitd}(1106)
├─rsyslogd(1358)─┬─{rsyslogd}(1379)
│ └─{rsyslogd}(1380)
├─sshd(1356)─┬─sshd(1952)───bash(1954)
│ └─sshd(2363)───bash(2365)───pstree(2472)
3.3 根据要求,只显示某些内容 必会
#通过awk取列
[root@lnh ~]# ps aux|awk '{print $1}'|head -5
USER
root
root
root
root
[root@lnh ~]# ps aux|awk '{print $1,$3}'|head -5
USER %CPU
root 0.0
root 0.0
#ps命令的选项,输出指定的内容
[root@lnh ~]# ps axo user,%cpu,stat,cmd|head -5
USER %CPU STAT CMD
root 0.0 Ss /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 0.0 S [kthreadd]
root 0.0 S< [kworker/0:0H]
root 0.0 S [kworker/u256:0]
#ps不输出每一列的标题
[root@lnh ~]# ps --no-heading axo user,%cpu,stat,cmd|head -5
root 0.0 Ss /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 0.0 S [kthreadd]
root 0.0 S< [kworker/0:0H]
root 0.0 S [kworker/u256:0]
root 0.0 S [ksoftirqd/0]
3.4 取出某一个服务(crond)的进程信息(pid,%cpu,%mem,command)
[root@lnh ~]# ps aux|grep 'crond' |awk '{print $2,$3,$4,$11}'
1093 0.0 0.0 /usr/sbin/crond
#完全使用ps命令过滤出来
[root@lnh ~]# ps -no-heading -o pid,%cpu,%mem,command -C crond
PID %CPU %MEM COMMAND
1093 0.0 0.0 /usr/sbin/crond -n
-no-heading 不显示标题
-o 输出指定列
-C 过滤,注意不要加上ax
补充
awk最后的列
[root@lnh ~]# echo 1 2 3 4 |awk '{print $NF}' 4 [root@lnh ~]# echo 1 2 3 4 |awk '{print $(NF-1)}' 3 [root@lnh ~]# echo 1 2 3 4 |awk '{print $NF-2}' 2
3.5 取出所有进程中内存使用率最高的前5
[root@lnh ~]# ps aux|sort -rnk4 |head -5
root 1414 0.0 1.8 489908 37356 ? Sl 08:42 0:19 /usr/local/teleport/bin/tp_web start
root 1355 0.0 0.9 574280 19484 ? Ssl 08:42 0:03 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
root 1086 0.0 0.5 474352 10844 ? Ssl 08:42 0:00 /usr/sbin/NetworkManager --no-daemon
polkitd 1050 0.0 0.5 612232 11096 ? Ssl 08:42 0:00 /usr/lib/polkit-1/polkitd --no-debug
root 2363 0.0 0.3 161508 6084 ? Ss 15:30 0:00 sshd: root@pts/0
[root@lnh ~]# ps aux --sort=-%mem |head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1414 0.0 1.8 489908 37356 ? Sl 08:42 0:19 /usr/local/teleport/bin/tp_web start
root 1355 0.0 0.9 574280 19484 ? Ssl 08:42 0:03 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
polkitd 1050 0.0 0.5 612232 11096 ? Ssl 08:42 0:00 /usr/lib/polkit-1/polkitd --no-debug
root 1086 0.0 0.5 474352 10844 ? Ssl 08:42 0:00 /usr/sbin/NetworkManager --no-daemon
#默认是升序排序,指标前面加上-号表示降序排序
3.6 top基础使用与快捷键 必会
#基础必会用法
q 退出
默认3秒刷新1次, 空格立刻刷新.
P 默认按照CPU使用率排序
M 按照内存使用率排序
#进阶用法:
top输入z进入颜色模式 按 x 标记出当前是按照哪列排序.
shift + > 向右
shift + < 向左
#top命令升级,支持鼠标操作htop
#htop是epel中的命令
3.7 非交互模式
#未来想获取top命令的结果,指标,需要让top运行在非交互模式
[root@lnh ~]# top -bn1 |awk 'NR==2'
Tasks: 101 total, 1 running, 100 sleeping, 0 stopped, 0 zombie
-b 非交互模式
-n 只输出1次结果
[root@lnh ~]# top -bn1 |awk 'NR==2{print $(NF-1),$NF}'
0 zombie
四、后台管理
前台(前台运行):需要连接后进行运行或操作,连接断开这个命令,操作就自动结束
后台(后台运行):让软件进入系统的后台,持续运行,一般情况下连接断开了也不会影响软件运行
软件后台运行方法 | 说明 | 应用场景 |
---|---|---|
命令 & | 常用的后台运行方法 | 大部分时候使用这个 |
nohup 命令 & | 会记录输出到文件中默认交nohup.out | 如果过想记录输出则可以用这个方法 |
先运行命令,然后按ctrl +z (后台挂起), bg恢复 |
软件进入后台运行 | 顽固软件ctrl+c无法结束,可以通过这个方法结束它 |
screen命令 | 通过软件创建控件,让命令在这个空间运行 | 稳定性比&,nohup高 |
1.&方法 必会
#让sleep 999命令后台运行
[root@lnh ~]# sleep 999 &
[1] 4409
[root@lnh ~]# ps aux| grep 4409
root 4409 0.0 0.0 108052 356 pts/1 S 18:32 0:00 sleep 999
root 4411 0.0 0.0 112808 960 pts/1 R+ 18:32 0:00 grep --color=auto 4409
[1] 4409
[1] 表示手动进入到后台运行的第1个进程
4409 表示进程pid
jobs可以查看手动进入后台的进程
[root@lnh ~]# jobs
[1]+ Running sleep 999 &
2. nohup 命令 &方法
可以保留输出到指定文件中,默认是nohup文件。
#让ping baidu.com命令后台运行并记录输出
[root@lnh ~]# nohup ping -c20 baidu.com &
[2] 4412
[root@lnh ~]# nohup: ignoring input and appending output to ‘nohup.out’
[root@lnh ~]# cat nohup.out
PING 10.0.0.200 (10.0.0.200) 56(84) bytes of data.
64 bytes from 10.0.0.200: icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from 10.0.0.200: icmp_seq=2 ttl=64 time=0.051 ms
64 bytes from 10.0.0.200: icmp_seq=3 ttl=64 time=0.046 ms
64 bytes from 10.0.0.200: icmp_seq=4 ttl=64 time=0.047 ms
64 bytes from 10.0.0.200: icmp_seq=5 ttl=64 time=0.025 ms
64 bytes from 10.0.0.200: icmp_seq=6 ttl=64 time=0.046 ms
64 bytes from 10.0.0.200: icmp_seq=7 ttl=64 time=0.034 ms
64 bytes from 10.0.0.200: icmp_seq=8 ttl=64 time=0.049 ms
64 bytes from 10.0.0.200: icmp_seq=9 ttl=64 time=0.017 ms
64 bytes from 10.0.0.200: icmp_seq=10 ttl=64 time=0.020 ms
64 bytes from 10.0.0.200: icmp_seq=11 ttl=64 time=0.047 ms
64 bytes from 10.0.0.200: icmp_seq=12 ttl=64 time=0.049 ms
64 bytes from 10.0.0.200: icmp_seq=13 ttl=64 time=0.046 ms
64 bytes from 10.0.0.200: icmp_seq=14 ttl=64 time=0.046 ms
64 bytes from 10.0.0.200: icmp_seq=15 ttl=64 time=0.046 ms
64 bytes from 10.0.0.200: icmp_seq=16 ttl=64 time=0.046 ms
64 bytes from 10.0.0.200: icmp_seq=17 ttl=64 time=0.056 ms
64 bytes from 10.0.0.200: icmp_seq=18 ttl=64 time=0.046 ms
64 bytes from 10.0.0.200: icmp_seq=19 ttl=64 time=0.048 ms
64 bytes from 10.0.0.200: icmp_seq=20 ttl=64 time=0.048 ms
-c 表示次数,ping多少次
提示:
如果想输出到其他文件
nohup 命令>新的文件 &
3. ctrl+z
这个快捷键不是撤销,这个快捷键在linux下面表示让当前运行的命令货服务进入后台挂起,如果转为后台运行需要在输入bg,如果是误触ctrl+z,可以通过fg让进程,命令回到前台
4.screen
一般使用&,nohup让命令,服务进入后台运行,但是可能不太稳定
这时候可以通过screen命令较为稳定的后台运行一些指定
原理:创建screen空间,screen命令维持,在里面运行的命令只要空间在,里面的命令就不会断(会在后台运行)
#安装screen
[root@lnh ~]# yum -y install screen
#运行screen,进入screen虚拟窗口
[root@lnh ~]# screen
[root@lnh ~]# ping baidu.com
#退出screen
ctrl+a 然后按d
#查看screen窗口
[root@lnh ~]# screen -ls
There is a screen on:
4455.pts-1.lnh (Detached)
1 Socket in /var/run/screen/S-root.
#恢复
[root@lnh ~]# screen -r
#彻底结束
ctrl+d
五、杀手三剑客
命令 | 说明 | |
---|---|---|
kill | kill+进程pid进行结束进程,常用 | |
pkill | pkill+进程名字,模糊查找 | |
killall | killall+进程名字,精确查找 |
kill -9 pid 发送强制结束信号,别用kill -9结束数据库
六 、负载
1.概述
负载:load average平均负载,最近1分钟,5分钟,15分钟系统平均负载
负载:衡量系统繁忙程度指标
衡量是否繁忙:数值越接近cpu核心总数,系统的负载越高
预警:建议负载达到cpu核心总数的70%-80%
原理:
平均负载是指单位时间内,系统处于可运行状态(R,S)和不可中断状态(D)的平均进程数,也就是平均活跃进程数
负载是衡量正在运行的进程的平均数(可中断进程和不可中断进程)
2.负载高
排查流程:
-
通过监控软件发现系统负载高(w,lscpu查看)
-
判断是cpu还是io导致的负载高
- cpu高:top 中的us(user用户占用cpu) sy(system 系统占用cpu)
- io高:top中的wa(iowait)磁盘io导致的负载高
- cpu高:top 中的us(user用户占用cpu) sy(system 系统占用cpu)
-
如果是cpu导致的,排查出那个进程导致的,pa aux 过滤出占用cpu较高的进程
如果是io导致的,排查那个进程导致的,通过iotop -o 排查