金鱼哥戏说RHCSA认证:十一、监控和管理Linux进程

举报
金鱼哥 发表于 2022/09/13 17:10:36 2022/09/13
【摘要】 第十一章 监控和管理Linux进程

🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
📚个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL😜
💬格言:努力不一定成功,但要想成功就必须努力🔥

🎈支持我:可点赞👍、可收藏⭐️、可留言📝


本章节介绍如何监控和管理Linux进程。章节篇幅有点长,但希望能够好好理解并熟练掌握,是日后工作进行排错经常使用的知识点。


📜11.1 什么是进程

Process: 运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位

  • 进程ID(Process ID,PID)号码被用来标记各个进程
  • UID、GID、和SELinux语境决定对文件系统的存取和访问权限
  • 通常从执行进程的用户来继承
  • 存在生命周期

进程创建:

  • init:第一个进程,从 rhel7 以后为systemd
  • 进程:都由其父进程创建,fork(),父子关系,CoW:Copy On Write(写实复制)

进程是通过执行一个静态程序而触发的。静态的程序触发成一个动态的程序。


📑11.1.1 从windows的角度去看待进程

  • 打开任务管理器,观察状态

image-20210331135246338

  • 打开运行C:\Windows\system32\cmd.exe

    image-20210331135543065

  • 点击箭头扩展,然后运行一个命令,观察

    image-20210331135647396

    image-20211223153516846

  • 观察进程对资源的使用

    image-20210331140811318

因此,进程是动态的

  • 进程数量的统计

    image-20210331141905346


📑11.1.2 从linux的角度去看待进程

  • 通过top命令,可以获得动态的类任务管理器页面

    image-20210331144551319

  • 进程是通过运行一个静态的可执行文件,从而生成的一个动态的进程

    范例:

    #第一个终端执行
    [root@servera ~]# dd if=/dev/zero of=/dev/null
    #第二个终端执行
    [root@servera ~]# ps aux | grep "dd if"
    root        6463 98.8  0.0   7324   820 pts/1    R+   14:55   1:52 dd if=/dev/zero of=/dev/null
    root        6489  0.0  0.0  12108  1088 pts/2    R+   14:57   0:00 grep --color=auto dd if
    
  • 进程的拥有者

    进程在读取或者写入文件的时候,是采用这个拥有者的身份读取和写入的。所以针对需要读取和写入的这个拥有者必须要有权限。

    • 通常情况下,进程的拥有者为执行者。
    • 比如一些服务,通常进程的拥有者会在配置文件中指定为该服务的系统用户
    • GUID的二进制文件:/usr/bin/passwd
  • 进程的资源占用量

    • %cpu
    • %mem

📜11.2 进程状态

image-20210331154813635


📑进程的基本状态

  • 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写
    控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调
    度运行,把此时进程所处状态称为创建状态
  • 就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
  • 执行状态:进程处于就绪状态被调度后,进程进入执行状态
  • 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受
    到阻塞。在满足请求时进入就绪状态等待系统调用
  • 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行

📑进程更多的状态:

  • 运行态R:running
  • 睡眠态S\D:分为两种,可中断:interruptable,不可中断:uninterruptable
  • 停止态T:stopped,暂停于内存,但不会被调度,除非手动启动
  • 僵死态Z:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死
    态 的子进程

image-20210331163306188

范例:僵尸态

[root@servera ~]# bash
[root@servera ~]# echo $BASHPID
3988
[root@servera ~]# dd if=/dev/zero of=/dev/null

#再开一个终端,停止父进程bash,杀死dd进程,使其进入僵死态
[root@servera ~]# kill -19 3988
[root@servera ~]# kill -9 4018

#方法1:恢复父进程
[root@servera ~]# kill -18 3988

#方法2:杀死父进程
[root@servera ~]# kill -9 3988

📜11.3 进程管理和性能相关工具

📑11.3.1 进程树 pstree

pstree 可以用来显示进程的父子关系,以树形结构显示

来自于psmisc包

格式:
pstree [OPTION] [ PID | USER ]
常用选项:
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
-H pid 高亮指定进程及其前辈进程

范例:

[root@servera ~]# pstree 1
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─alsactl
        ├─atd
        ├─auditd─┬─sedispatch
        │        └─2*[{auditd}]
        ├─avahi-daemon───avahi-daemon
        ├─bluetoothd
        ├─chronyd
        ├─colord───2*[{colord}]
        
[root@servera ~]# pstree user1
bash───ping

[root@servera ~]# pstree | grep httpd
        |-httpd-+-httpd
        |       |-2*[httpd---64*[{httpd}]]
        |       `-httpd---80*[{httpd}]
[root@servera ~]# pstree -u | grep httpd
        |-httpd-+-httpd(apache)
        |       |-2*[httpd(apache)---64*[{httpd}]]
        |       `-httpd(apache)---80*[{httpd}]

[root@servera ~]# pstree -p
systemd(1)─┬─ModemManager(1002)─┬─{ModemManager}(1041)
           │                    └─{ModemManager}(1054)
           ├─NetworkManager(1172)─┬─{NetworkManager}(1177)
           │                      └─{NetworkManager}(1178)
           ├─VGAuthService(996)
           ├─accounts-daemon(1097)─┬─{accounts-daemon}(1102)
           │                       └─{accounts-daemon}(1108)

范例:高亮显示前辈进程

[root@servera ~]# pstree -pH 4207

image-20210331170323167


📑11.3.2 进程信息 ps

ps 即process state,可以进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关
信息均保存在/proc/PID目录下的各文件中

ps格式
ps [OPTION]...

支持三种选项:

  • UNIX选项 如: -A -e
  • BSD选项 如: a
  • GNU选项 如: --help
常用选项:
a 选项包括所有终端中的进程
x 选项包括不链接终端的进程
u 选项显示进程所有者的信息
f 选项显示进程树,相当于 --forest
k|--sort 属性 对属性排序,属性前加 - 表示倒序
o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem
L 显示支持的属性列表
-C cmdlist 指定命令,多个命令用,分隔
-L 显示线程
-e 显示所有进程,相当于-A
-f 显示完整格式程序信息
-F 显示更完整格式的进程信息
-H 以进程层级格式显示进程相关信息
-u userlist 指定有效的用户ID或名称
-U userlist 指定真正的用户ID或名称
-g gid或groupname 指定有效的gid或组名称
-G gid或groupname 指定真正的gid或组名称
-p pid 显示指pid的进程
--ppid pid 显示属于pid的子进程
-t ttylist 指定tty,相当于 t
-M 显示SELinux信息,相当于Z
ps 输出属性
C : ps -ef 显示列 C 表示cpu利用率
VSZ: Virtual memory SiZe,虚拟内存集,线性内存
RSS: ReSident Size, 常驻内存集
STAT:进程状态
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前台进程
l: 多线程进程
L:内存分页并带锁
N:低优先级进程
<: 高优先级进程
s: session leader,会话(子进程)发起者
I:Idle kernel thread,新内核新特性(空闲线程)
ni: nice值
pri: priority 优先级
rtprio: 实时优先级
psr: processor CPU编号
常用组合:
aux
-ef
-eFH
-eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm
axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

范例:查看进程详细信息

[root@servera ~]# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 15:17 ?        00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
root           2       0  0 15:17 ?        00:00:00 [kthreadd]
root           3       2  0 15:17 ?        00:00:00 [rcu_gp]
root           4       2  0 15:17 ?        00:00:00 [rcu_par_gp]
root           6       2  0 15:17 ?        00:00:00 [kworker/0:0H-kblockd]

[root@servera ~]# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.7 180140 14504 ?        Ss   15:17   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
root           2  0.0  0.0      0     0 ?        S    15:17   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   15:17   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   15:17   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   15:17   0:00 [kworker/0:0H-kblockd]
root           8  0.0  0.0      0     0 ?        I<   15:17   0:00 [mm_percpu_wq]
root           9  0.0  0.0      0     0 ?        S    15:17   0:00 [ksoftirqd/0]

范例:

#查看进程的父子关系
[root@servera ~]# ps auxf
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           2  0.0  0.0      0     0 ?        S    15:17   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   15:17   0:00  \_ [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   15:17   0:00  \_ [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   15:17   0:00  \_ [kworker/0:0H-kblockd]
root           8  0.0  0.0      0     0 ?        I<   15:17   0:00  \_ [mm_percpu_wq]
root           9  0.0  0.0      0     0 ?        S    15:17   0:00  \_ [ksoftirqd/0]
root          10  0.0  0.0      0     0 ?        I    15:17   0:00  \_ [rcu_sched]
root          11  0.0  0.0      0     0 ?        S    15:17   0:00  \_ [migration/0]
root          12  0.0  0.0      0     0 ?        S    15:17   0:00  \_ [watchdog/0]

#查看进程的特定属性
[root@servera ~]# ps axo pid,cmd,%mem,%cpu
    PID CMD                         %MEM %CPU
      1 /usr/lib/systemd/systemd --  0.7  0.0
      2 [kthreadd]                   0.0  0.0
      3 [rcu_gp]                     0.0  0.0
      4 [rcu_par_gp]                 0.0  0.0
      6 [kworker/0:0H-kblockd]       0.0  0.0

范例:针对属性排序,rhel6 以下版本不支持

#按CPU利用率倒序排序
[root@servera ~]# ps axo pid,cmd,%cpu,%mem k -%cpu
    PID CMD                         %CPU %MEM
   4568 dd if=/dev/zero of=/dev/nul 88.3  0.0
      1 /usr/lib/systemd/systemd --  0.0  0.7
      2 [kthreadd]                   0.0  0.0
      3 [rcu_gp]                     0.0  0.0
      4 [rcu_par_gp]                 0.0  0.0
      6 [kworker/0:0H-kblockd]       0.0  0.0

#按内存倒序排序
[root@servera ~]# ps axo pid,cmd,%cpu,%mem --sort -%mem
    PID CMD                         %CPU %MEM
   1860 /usr/bin/gnome-shell         0.0  8.3
   1900 /usr/bin/Xwayland :1024 -ro  0.0  3.2
   1929 /usr/libexec/ibus-x11 --kil  0.0  3.1
   1365 /usr/sbin/libvirtd           0.0  2.3
   1073 /usr/libexec/platform-pytho  0.0  2.2
   1070 /usr/libexec/sssd/sssd_nss   0.0  2.0
   1187 /usr/libexec/platform-pytho  0.0  1.7
   1975 /usr/libexec/gsd-xsettings   0.0  1.5
   1983 /usr/libexec/gsd-color       0.0  1.4

📑11.3.3 查看进程信息prtstat

可以显示进程信息,来自于psmisc包

格式:
prtstat [options] PID ...
选项:
-r raw 格式显示

范例:

[root@servera ~]# prtstat 1407
Process: httpd         		State: S (sleeping)
  CPU#:  0  		TTY: 0:0	Threads: 1
Process, Group and Session IDs
  Process ID: 1407		  Parent ID: 1
    Group ID: 1407		 Session ID: 1407
  T Group ID: -1

Page Faults
  This Process    (minor major):     1689        54
  Child Processes (minor major):        0         0
CPU Times
  This Process    (user system guest blkio):   0.01   0.09   0.00   0.07
  Child processes (user system guest):         0.00   0.00   0.00
Memory
  Vsize:       288 MB    
  RSS:         11 MB      		 RSS Limit: 18446744073709 MB
  Code Start:  0x55b6fa9bb000		 Code Stop:  0x55b6faa40f60
  Stack Start: 0x7fffc2b468a0
  Stack Pointer (ESP):          0	 Inst Pointer (EIP):          0
Scheduling
  Policy: normal
  Nice:   0 		 RT Priority: 0 (non RT)
[root@servera ~]# prtstat -r 1407
         pid: 1407           	                  comm: httpd
       state: S              	                  ppid: 1
        pgrp: 1407           	               session: 1407
      tty_nr: 0              	                 tpgid: -1
       flags: 400100         	                minflt: 1689
     cminflt: 0              	                majflt: 54
     cmajflt: 0              	                 utime: 1
       stime: 9              	                cutime: 0
      cstime: 0              	              priority: 20
        nice: 0              	           num_threads: 1
 itrealvalue: 0              	             starttime: 1054
       vsize: 288198656      	                   rss: 2884
      rsslim: 18446744073709551615	             startcode: 94244376915968
     endcode: 94244377464672 	            startstack: 140736459991200
     kstkesp: 0              	               kstkeip: 0
       wchan: 1              	                 nswap: 0
      cnswap: 1              	           exit_signal: 17
   processor: 1              	           rt_priority: 0
      policy: 0              	 delayaccr_blkio_ticks: 7
  guest_time: 0              	           cguest_time: 0

📑11.3.4 搜索进程

按条件搜索进程

  • ps 选项 | grep ‘pattern’ 灵活
  • pgrep 按预定义的模式
  • /sbin/pidof 按确切的程序名称查看pid

11.3.4.1 pgrep

命令格式

pgrep [options] pattern

常用选项

-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示指定进程的子进程

范例:

[root@servera ~]# pgrep -u user1
2593
2623
2657
[root@servera ~]# pgrep -lu user1
2593 bash
2623 bash
2657 ping

#错误写法,切记用户选项在后
[root@servera ~]# pgrep -ul user1
pgrep: invalid user name: l

[root@servera ~]# pgrep -au user1
2593 -bash
2623 bash

[root@servera ~]# pgrep -aP 2623
2695 ping baidu.com

[root@servera ~]# pgrep -at pts/1
2563 -bash
2592 su - user1
2593 -bash
2623 bash
2695 ping baidu.com

11.3.4.2 pidof

命令格式

pidof [options] [program [...]]

常用选项:

-x 按脚本名称查找pid

范例:

[root@servera ~]# pidof httpd
1928 1927 1926 1924 1407

[root@servera ~]# vim ping.sh
[root@servera ~]# chmod a+x ping.sh
[root@servera ~]# ./ping.sh
[root@servera ~]# pidof -x ping.sh
3076

📑11.3.5 负载查询 uptime

/proc/uptime 包括两个值,单位 s

  • 系统启动时长
  • 空闲进程的总时长(按总的CPU核数计算)

uptime 和 w 显示以下内容

  • 当前时间
  • 系统已启动的时间
  • 当前上线人数
  • 系统平均负载(1、5、15分钟的平均负载,一般不会超过1,超过5时建议警报)

系统平均负载: 指在特定时间间隔内运行队列中的平均进程数,通常每个CPU内核的当前活动进程数不大
于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题


📑11.3.6 查看进程实时状态 top

top 提供动态的实时进程状态
有许多内置命令
帮助:h 或 ? ,按 q 或esc 退出帮助

排序:
P:以占据的CPU百分比,%CPU
M:占据内存百分比,%MEM
T:累积占据CPU时长,TIME+

首部信息(风格)显示:
uptime信息:l命令
tasks及cpu信息:t命令
cpu分别显示:1 (数字)
memory信息:m命令

退出命令:q
修改刷新时间间隔:s
终止指定进程:k
保存文件:W

top命令栏位信息简介

us:用户空间
sy:内核空间
ni:调整nice时间
id:空闲
wa:等待IO时间
hi:硬中断
si:软中断(模式切换)
st:虚拟机偷走的时间

top选项:

-d # 指定刷新时间间隔,默认为3-b 全部显示所有进程
-n # 刷新多少次后退出

示例:

top -d 5 -n 5

📑11.3.7 RHEL8 新特性 cockpit

Cockpit 是rhel 8 取入的新特性,是一个基于 Web 界面的应用,它提供了对系统的图形化管理

  • 监控系统活动(CPU、内存、磁盘 IO 和网络流量)
  • 查看系统日志条目
  • 查看磁盘分区的容量
  • 查看网络活动(发送和接收)
  • 查看用户帐户
  • 检查系统服务的状态
  • 提取已安装应用的信息
  • 查看和安装可用更新(如果以 root 身份登录)并在需要时重新启动系统
  • 打开并使用终端窗口

范例:安装 cockpit

[root@servera ~]# dnf -y install cockpit
[root@servera ~]# systemctl enable --now cockpit.socket
[root@servera ~]# ss -altun(查看9090端口是否启用)

打开浏览器,访问以下地址:

https://rhel8主机:9090

image-20210401223739007

image-20210401223803763

image-20210401223816834


📑11.3.8 信号发送 kill

kill:内部命令,可用来向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以
SIG开头(可省略),不区分大小写

显示当前系统可用信号:

kill -l
trap -l

查看帮助:man 7 signal

常用信号:

1) SIGHUP 无须关闭进程而让其重读配置文件
2) SIGINT 中止正在运行的进程;相当于Ctrl+c
3) SIGQUIT 相当于ctrl+\
9) SIGKILL 强制杀死正在运行的进程
15) SIGTERM 终止正在运行的进程,默认信号
18) SIGCONT 继续运行
19) SIGSTOP 后台休眠

指定信号的方法 :

  • 信号的数字标识:1, 2, 9
  • 信号完整名称:SIGHUP,sighup
  • 信号的简写名称:HUP,hup

向进程发送信号:

按PID:

kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

范例

kill -1 pid …
kill -n 9 pid
kill -s SIGINT pid

按名称:killall 来自于psmisc包

killall可以直接使用信号控制进程,不需要查阅pid等信息

killall [-SIGNAL] comm…

pkill=killall

范例:

[root@servera ~]# kill httpd
-bash: kill: httpd: arguments must be process or job IDs
[root@servera ~]# killall httpd
[root@servera ~]# killall httpd
httpd: no process found 

特殊信号:0信号

范例:利用 0 信号实现进程的健康性检查

[root@servera ~]# killall -0 ping
[root@servera ~]# killall ping
[root@servera ~]# killall -0 ping
ping: no process found

#此方式有局限性,即使进程处于停止或僵尸状态,此方式仍然认为是进程是健康的

📑11.3.9 作业管理

Linux的作业控制

  • 前台作业:通过终端启动,且启动后一直占据终端
  • 后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)

image-20210401211918724

让作业运行于后台

  • 运行中的作业: Ctrl+z
  • 尚未启动的作业: COMMAND &

后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。

如果希望送往后台后,剥离与终端的关系:

  • nohup COMMAND &>/dev/null &

查看当前终端所有作业:

jobs

作业控制:

fg [[%]JOB_NUM]:把指定的后台作业调回前台
bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行
kill [%JOB_NUM]: 终止指定的作业

💡总结

RHCSA认证作为基础认证,涉及的基础内容需要大家好好进行学习并巩固。有良好的基础才能更上一层楼。
好好加油,可以噶🤪。

以上就是【金鱼哥】对 第十一章 监控和管理Linux进程 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

💾红帽认证专栏系列:
RHCSA专栏:戏说 RHCSA 认证
RHCE专栏:戏说 RHCE 认证
此文章收录在RHCA专栏:RHCA 回忆录

如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。

如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。