Linux进程管理
进程管理
一、进程
名字 | 含义 | |
---|---|---|
程序 | 安装包,程序代码,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 排查
本文作者:wh459086748
本文链接:https://www.cnblogs.com/world-of-yuan/p/17013581.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步