第十篇:系统管理体系之进程管理

进程

  进程、程序、守护进程

名字 含义
程序 安装包、程序代码、app(存放在磁盘上面)
进程 正在运行的程序、命令、服务都可以称为进程(运行在内存中)
守护进程 持续运行的进程,也可以叫做服务

  异常进程的分类

 僵尸进程⭐⭐⭐⭐⭐

复制代码
# 僵尸进程
    当子进程比父进程先结束,而父进程没有回收子进程和释放子进程所占有的资源,此时子进程将成为一个僵尸进程

# 查找僵尸进程
    ps aux 过滤Z状态
    top 命令

# 解决
    找出僵尸进程上级进程,结束进程即可
    如果上级进程是主进程(pid=1),则需要重启linux系统
复制代码

 孤儿进程 

  • 孤儿进程:父进程执行完成或被终止后子进程仍在继续运行
  • 孤儿进程会被系统直接接管(ststemd进程)

  僵尸进演示⭐⭐⭐⭐⭐

复制代码
#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <sys/types.h>  

int main() {  
    pid_t pid;  

    // 创建一个子进程  
    pid = fork();  

    if (pid < 0) {  
        // fork 失败  
        perror("fork failed");  
        exit(1);  
    } else if (pid == 0) {  
        // 子进程  
        printf("子进程: 我是子进程,PID=%d\n", getpid());  
        // 子进程执行完之后直接退出  
        exit(0);  
    } else {  
        // 父进程  
        printf("父进程: 我是父进程,PID=%d,子进程PID=%d\n", getpid(), pid);  
        // 父进程不调用 wait,使得子进程成为僵尸进程  
        printf("父进程: 睡眠 30 秒,不调用 wait,导致僵尸进程的产生。\n");  
        sleep(30); // 父进程睡眠 30 秒  

        // 父进程将退出  
        printf("父进程: 睡眠结束,父进程将退出。\n");  
        exit(0);  
    }  
}
zombine.c
复制代码

 1)通过gcc生成僵尸进程的命令文件

复制代码
# gcc命令
    gcc是一个广泛使用的开源编辑器,主要用于编译C、C++、Fortran等编程语言的源代码
    -o 用于指定输出文件的名称

[root@yuan ~]# ll zombine*
-rw-r--r--. 1 root root  975 9月  21 19:54 zombine.c
[root@yuan ~]# gcc zombine.c -o zombine
[root@yuan ~]# ll zombine*
-rwxr-xr-x. 1 root root 8704 9月  21 20:18 zombine
-rw-r--r--. 1 root root  975 9月  21 19:54 zombine.c

[root@yuan ~]#./zombine
复制代码

 2)top命令查看是否有僵尸进程

 3)过滤出僵尸进程

[root@yuan ~]# ps aux |grep Z    # 找出僵尸进程的pid
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       1954  0.0  0.0      0     0 pts/0    Z+   19:58   0:00 [zombine] <defunct>
root       1923  0.0  0.0 112824   956 pts/1    R+   19:58   0:00 grep --color=auto Z
僵尸进程的pid为1954

 4)pstree -p查看僵尸进程的父进程

# pstree属于psmisc软件包,需要用yum命令下载
[root@yuan ~]# pstree -p |grep 1954
           |-sshd(1484)-+-sshd(1729)---bash(1733)---zombine(1953)---zombine(1954)

 5)结束僵尸进程

# 直接结束僵尸进程
    kill 1954  # 失败,无法直接结束僵尸进程
# 结束僵尸进程的父进程
    kill 1953  # 成功

进程监控指令⭐⭐⭐⭐⭐

 

监控命令 含义
ps 静态:process status  ps查看当前瞬间进程状态,一般用于临时检查或取值
top 动态:整体查看系统状态(负载、僵尸进程、cpu、内存...)类似于windows的任务管理器

  ps命令格式

 概述

  • ps -ef(everyon:显示所有用户的所有进程  full:以完整的格式显示进程的信息)
    • UID:进程属于的用户
    • PID:进程id号,大部分都是随机
    • PPID:父进程的id号 pstree -p查看进程与父进程之间详细关系
    • CMD:进程名字
  •  ps aux(all:显示所有用户的进程  user:以用户友好的形式显示进程 )
    •  ps aux 比 ps -ef 显示的内容多(cpu的使用率、内存的使用率、进程状态...)

 ps aux每一列含义

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 进程名字(命令、选项、参数)  [ ]括起来的是内核进程,其他是系统进程

 进程状态⭐⭐

  • 进程状态:正在运行的进程、僵尸进程、正在进行io的进程、前台或后台运行的进程
  • 进程状态=基本状态+附加状态
STAT基本状态 描述
R(running) 进程运行
S 可中断进程(可以随时停止)
T(terminate) 进程被暂停(挂起)ctrl + z
D 不可中断进程(进程正在进行io操作)
Z(zombie) 僵尸进程(异常的进程)
STAT状态+附加状态 描述
S/s 进程是控制进程(父进程/主进程)
< 优先级较高的进程
N 优先级较低的进程
+ 当前进程运行在前台
l(小写L) 进程是多线程

常见的进程状态

  • R+    前台运行中的进程
  • R      后台运行的进程
  • S      可中断的进程
  • T      后台挂起的进程
  • D   不可中断的进程(io进程)
  • Ss    可中断的管理进程
  • S<    可中断的高优先级进程
  • Ssl   可中断的多线程的管理进程
  • Z      僵尸进程

  top命令格式

 top命令详解

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

 top基础使用与快捷键⭐⭐⭐⭐⭐

基础必会用法
q 退出
空格 空格立即刷新(默认3秒刷新一次)
P 按照CPU使用率排序(默认是按照cpu使用率排序)
M 按照内存使用率排序
进阶用法
z 进入颜色模式
x 标记处当前是按照那列进行排序
shift + > 向右
shift + < 向左
  • htop(top命令升级版,支持鼠标操作)
  • 说明:htop是epel源中的命令

 top命令的非交互式

需要获取top命令的结果,需要在非交互模式下执行

# 案例:取出top中的第二行最后两列的信息
top |awk 'NR=2'
top -bn1 |awk 'NR=2'
-b    非交互模式
-n    输出结果的次数

top -bn1 |awk 'NR = 2' |awk '{print $(NF-1),$NF}'

  案例

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

复制代码
# 案例:过滤出crond进程信息
[root@yuan ~]# ps aux |grep crond
root       1098  0.0  0.0 126388  1680 ?        Ss   19:18   0:00 /usr/sbin/crond -n
root       1872  0.0  0.0 112824   980 pts/0    R+   21:10   0:00 grep --color=auto crond
[root@yuan ~]# ps -ef |grep crond
root       1098      1  0 19:18 ?        00:00:00 /usr/sbin/crond -n
root       1874   1755  0 21:10 pts/0    00:00:00 grep --color=auto crond

# 过滤的时候可以通过grep -v grep 排除grep命令自己的进程
[root@yuan ~]# ps -ef |grep crond |grep -v grep
root       1098      1  0 19:18 ?        00:00:00 /usr/sbin/crond -n
复制代码

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

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

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

复制代码
# 案例:根据要求取出ps命令结果中的部分内容
    # ps aux
        [root@yuan ~]# ps aux |awk '{print $1,$3}'
        USER %CPU
        root 0.0
        root 0.0
        root 0.0
        # 用该方法取cmd这一列会导致数据缺失

    # awk倒序取列
        [root@yuan ~]# echo 1 a b yuan 996 |awk '{print $NF}'
        996
        [root@yuan ~]# echo 1 a b yuan 996 |awk '{print $NF-1}'
        995
        [root@yuan ~]# echo 1 a b yuan 996 |awk '{print $(NF-1)}'
        yuan

    # ps aox  ps命令的选项,输出指定的内容(小写)
        [root@yuan ~]# ps axo user,%cpu,stat
        USER     %CPU STAT
        root      0.0 Ss
        root      0.0 S
        root      0.0 S<

# 不显示标题
    [root@yuan ~]# ps --no-heading axo user,%cpu
    root      0.0
    root      0.0
复制代码

 案例4:过滤出某个服务的进程信息

复制代码
# 案例:过滤出crond服务的进程信息(pid、%cpu、%mem、command)
[root@yuan ~]# ps aux |grep 'crond' |awk '{print $2,$3,$4,$11}'
1098 0.0 0.0 /usr/sbin/crond
1921 0.0 0.0 grep

# 完全使用ps命令过滤
[root@yuan ~]# ps --no-heading -o pid,%cpu,%mem,command -C crond
  1098  0.0  0.0 /usr/sbin/crond -n
--no-heading 不显示标题 -C 过滤(注意不要加上ax) -o 指定输出列
复制代码

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

# 案例:取出所有进程中内存使用率最高的前2行
[root@yuan ~]# ps --no-heading aux |sort -rnk4 |head -2
root       1115  0.0  1.4 359104 29744 ?        Ssl  19:18   0:00 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
root       1479  0.0  0.8 574288 17464 ?        Ssl  19:18   0:01 /usr/bin/python2 -Es /usr/sbin/tuned -l -P

后台管理

  • 前台进程是在用户的终端中直接运行的进程,用户可以与之交互。
  • 后台进程是在用户的终端中运行,但不占用终端的控制,可以在后台执行任务
软件后台运行方法 说明 应用场景
命令 & 后台运行 大部分的时候应用
nohup 命令 & 与&类似,会将记录输出到文件中(默认叫nohup.out) 应用于将记录输出
先运行命令,然后按ctrl+z(后台挂起) 软件进入后台运行 顽固软件ctrl+c无法结束,可以通过这个方法结束该软件
screen命令 通过软件创建空间,让这个命令在这个空间运行 稳定

  命令 &⭐⭐⭐⭐⭐

复制代码
[root@yuan ~]# sleep 30 &
[1] 1818
[root@yuan ~]# ps aux |grep 1818
root       1818  0.0  0.0 108052   356 pts/0    S    20:12   0:00 sleep 30
root       1820  0.0  0.0 112824   976 pts/0    R+   20:13   0:00 grep --color=auto 1818

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

[root@yuan ~]# jobs    # 查看手动进入后台的进程
[1]   运行中               sleep 30 &
复制代码

  nohup 命令 &

与&不同:可保留输出到指定文件中(默认是nohop.out文件)

# 案例:让ping baidu.com 命令后台运行并记录输出
    nohup ping -c20 baidu.com &
    tail -f nohup.out

ping -c    表示ping多少次
# 如果想输出到其他文件
    nohup 命令 >新的文件 &
    nohup ping baidu.com >lidao-new.txt &

  ctrl + z (使用较少)

  • 这个快捷键不是撤销
  • 在Linux下面表示让当前运行的命令或服务进入后台挂起
  • 如果转为前台需要输入bg / fg

  screen⭐⭐⭐

一般我们使用&、nohup方法让命令、服务进入后台运行可能不稳定

screen命令可以使一些命令较为稳定的在后台运行

简易原理:创建screen空间,命令只要在空间里,里面的命令就不会断(后台运行)

复制代码
# 1、安装screen
    yum install -y screen
# 2、运行screen
    screen    # 进入screen虚拟窗口
# 3、执行命令
    输入命令 ping www.baidu.com
# 4、退出screen窗口
    ctrl + a  然后按  d(正常退出)
    断网、断开连接(异常退出)
# 5、查看screen窗口
    screen -ls
# 6、恢复
    screen -r  要恢复的screen虚拟窗口
# 7、彻底结束(删除当前虚拟窗口)
    ctrl + d
复制代码

杀手三剑客(三个用于结束进程的命令)

命令 说明
kill(常用) kill + 进程的pid (结束进程)
pkill(慎用) pkill + 进程名字(模糊名字) (模糊删除)
killall killall + 进程名字(精确名字)
  • kill信号
    • kill  pid  默认发送结束信号
    • kill -9 pid  放松强制结束信号(别用kill -9 结束数据库)

负载

  概述

  • 负载(load average):平均负载,最近1分钟、5分钟、15分钟系统平均负载
  • 负载:衡量系统繁忙程度的指标
  • 衡量是否繁忙:数值越接近cpu核心总数,系统的负载越高
  • 预警:负载达到cpu核心总数的70-80%
# 负载原理
平均负载:平均负载指的是单位时间内,系统处于可运行状态(R、S)
              和不可中断状态(D)的平均进程数,也就是平均活跃进程数
负载是衡量正在运行的进程的平均数(可中断进程和不可中断进程)

 

  负载高的排查步骤

  • 1、通过监控软件发现系统负载高(w,lscpu查看)
  • 2、判断是cpu还是io导致的负载高
    • cpu高:top中的us(user 用户占用的cpu)、sy(system 系统占用的cpu)
    • io高:top中的wa(iowait)磁盘io导致的负载高
  • 3、定位
    • 如果是cpu导致的,排查出哪个进程导致的(ps aux过滤出占用cpu高的进程)
    • 如果是io导致的,排查出哪个进程导致的(通过iotop -o命令排查)
  • 4、未完待续(具体分析进程啥问题第二阶段解答)

 

posted @   猿小姜  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示