麒麟操作系统 (kylinos) 从入门到精通 -高级教程 - 第83篇 进程监控与管理

90 阅读16分钟

0.基础环境

类别:笔记本
型号:中国长城 NF14C
硬件平台:飞腾处理器D2000(ArmV8 指令集)
系统:银河麒麟操作系统 V10 SP1(2303)

关键词:Linux,进程监控,ps,top

1.基础理论

1.1程序、进程和线程三者的核心区别

特性维度程序(Program)进程(Process)线程(Thread)
本质存储在磁盘上的静态指令集合与数据程序的一次动态执行实例,是系统进行资源分配的基本单位进程内的一个执行流,是 CPU调度 的基本单位
资源拥有不占用系统运行时资源拥有独立的地址空间、数据栈、文件描述符等系统资源共享所属进程的资源和地址空间,仅拥有独立的栈、寄存器等少量必要资源
独立性-高,进程间相互隔离,一个进程崩溃通常不会影响其他进程低,线程共享进程资源,一个线程崩溃可能导致整个进程终止
创建与开销-创建(通常通过 fork())和上下文切换开销较大创建(通过 pthread_create())和上下文切换开销较小
通信机制-需要 IPC(进程间通信),如管道、消息队列、共享内存、信号量直接读写进程数据段进行通信,但需注意同步
主要应用场景任何可执行文件需要高隔离性、高稳定性的任务,如科学计算、安全沙箱、数据库服务需要高并发、频繁数据共享的任务,如Web服务器、GUI应用、多线程下载

🔍 程序 (Program)

程序是存储在磁盘或其他存储介质上的静态实体,它包含了一系列指令(代码)和数据,其本身并不占用系统运行时的资源(如CPU、内存)。例如,你编译生成的 a.out 或 python_script.py 就是一个程序。

🔍 进程 (Process)

当程序被加载到内存并开始执行时,它就成为了一个进程。进程是系统进行资源分配和调度的独立单位 。每个进程都有自己独立的虚拟地址空间、数据栈、寄存器以及文件描述符等,这使得进程间相互隔离,一个进程的崩溃通常不会直接影响其他进程。

Linux 中常用 pstophtop 等命令查看和管理进程 。进程间通信(IPC)需要特殊的机制,如管道、消息队列、共享内存、信号量等 。

🔍 线程 (Thread)

线程是进程内部的一个执行序列,是 CPU调度和执行的基本单位 。一个进程可以包含多个线程,所有这些线程共享进程的绝大部分资源,如代码段、数据段、打开的文件描述符和信号处理等 。但它们也拥有自己独立的栈空间和寄存器等少量必要资源以保证控制的相对独立性。

由于共享相同的地址空间,线程间通信非常高效,可以直接通过读写共享内存进行数据交换。但也正因如此,线程同步(如使用互斥锁 mutex、条件变量 condition variable)显得至关重要,以避免竞态条件(Race Condition)和数据不一致 。

在 Linux 中,线程通常通过 POSIX 线程库(pthreads)进行创建和管理 。

1.2作业

在 Linux 命令行环境中,作业(Job)  是一种特殊的管理机制,它允许用户在同一个终端会话(Shell Session)内管理多个运行中的命令或程序。这个机制就是作业控制 (Job Control)

1.2.1 什么是作业 (Job)?

定义:

  • 作业 是指在 Shell 环境中由用户启动的一个或多个命令的集合
  • 它主要用于区分和控制当前终端会话中的前台(Foreground)  任务和后台(Background)  任务。
  • 一个作业可以由单个命令组成,也可以由通过管道(|)连接的多个命令组成。

1.2.2 核心概念:前台与后台

Linux 作业控制的核心是区分任务是在前台运行还是在后台运行。

前台作业 (Foreground Job)

  • 特点:

    • 独占终端:  任务运行时,终端被阻塞,用户无法输入或执行其他命令。

    • 接收输入:  可以直接接收来自键盘的输入(如 Ctrl + C 中断)。

  • 启动方式:  直接输入命令并回车运行。

后台作业 (Background Job)

  • 特点:

    • 不独占终端:  任务在后台执行,终端立即返回提示符,用户可以继续输入和执行其他命令。

    • 不接收输入:  通常不接收键盘输入(除非使用特定命令)。

  • 启动方式:  在命令的末尾添加一个  &  符号。

2.图形化监控与管理

2.1. Grafana + Prometheus

多机集群,云,AI平台推荐

Prometheus

  • Prometheus 是一个开源的监控和报警系统,专门为云原生环境设计,能够高效地收集和存储时序数据。
  • 数据来源:Prometheus 通过 HTTP 请求从目标系统收集数据,并存储在时序数据库中。
  • 报警机制:可以通过 Alertmanager 配置告警规则,及时向管理员发送警告。

Grafana

  • Grafana 是一个开源的分析和可视化平台,支持与 Prometheus、InfluxDB 等多种数据源集成,提供强大的图形化面板和告警功能。
  • 优势:Grafana 提供了丰富的可视化功能,可以通过图表、表格、热力图等形式来展示系统的各项监控数据。

安装 Prometheus

# 安装 Prometheus
sudo apt-get install prometheus -y

安装 Grafana

官方源方式 (慢)

# 1. 下载 GPG 密钥文件
wget -q -O - https://apt.grafana.com/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/grafana.gpg
# 2. 添加 Grafana Stable 仓库到 sources.list.d 目录
echo "deb [signed-by=/usr/share/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
# 3. 更新软件包索引
sudo apt update -y
# 4.安装grafana 
sudo apt install grafana -y

清华镜像源方式(快,推荐)

Debian / Ubuntu 用户
首先信任 apt.grafana.com/ 的 GPG 公钥:

sudo wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key

确保你的 apt 支持 HTTPS:

apt-get install -y apt-transport-https -y

选择你希望安装的 Grafana 版本(与你的系统版本无关),将下方内容写入

sudo vim /etc/apt/sources.list.d/grafana.list

deb [signed-by=/usr/share/keyrings/grafana.key] mirrors.tuna.tsinghua.edu.cn/grafana/apt… stable main

安装 Grafana

sudo apt-get update
sudo apt-get install grafana
  1. 启动 Grafana 服务:
# 刷新服务重载
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start grafana-server
# 开机启动
sudo systemctl enable grafana-server
# 验证状态
systemctl status grafana-server
  1. 启动prometheus服务:

    启动服务 sudo systemctl start prometheus # 开机启动 sudo systemctl enable prometheus # 验证状态 systemctl status prometheus

  1. 访问 Grafana Web 界面:http://localhost:3000(默认端口为 3000)
    默认用户名:admin
    默认密码:admin

登录后,请求输入新密码:点skip跳过。

  1. 添加 Prometheus 作为数据源,配置图表、仪表盘等可视化内容。

点击左上角,添加connections,添加数据源

打开如下页面

点击add connection,在一系列源中,选择prometheus,这里可以输入这个名字过滤

点击下图的add new data source ,右上角

输入相关信息

上面的Localhost也可以换成本机IP地址。

托动页面到底部,点save保存即可。

这些如何使用,需要大家自己再去深入学习了

下面是创建链接时,可以使用的默认指标值

2.2. Cockpit

单机监控和管理推荐

  • Cockpit 是一个轻量级的 Web 管理界面,适用于管理 Linux 系统,支持实时监控系统性能、日志、服务等。

  • 特点

    • 易于安装和使用。

    • 提供图形化的系统监控界面,可以实时查看 CPU、内存、磁盘、网络等的状态。

    • 支持多主机管理,可以同时监控多个服务器。

Cockpit 安装

先停掉prometheus(因为其端口用的也是9090)

sudo systemctl disable prometheus
sudo systemctl stop prometheus

安装cockpit

# 安装 Cockpit
sudo apt-get install cockpit -y
# 启动 
sudo systemctl start cockpit
# 开机自启
sudo systemctl enable cockpit

访问 Cockpit

通过 http://localhost:9090(默认端口 9090)来访问 Cockpit Web 界面。

输入我们的电脑用户名:kylinos;密码:1,点击登录

Cockpit 使用

  • 登录后,你可以看到 CPU、内存、磁盘、网络等各类系统资源的实时监控。
  • 还支持查看日志、管理用户、启动/停止服务等功能。

2.3 系统自带的任务管理器

右击任务栏,或点击开始菜单,选择系统监视器

可以查看基本信息

3.命令行监控与管理

3.1. top  /  htop 命令

top 命令

top                               # 启动 top,显示实时的系统监控信息
top -u root                       # 显示 root 用户的所有进程
top -p 1234                        # 显示 PID 为 1234 的进程
top -c                             # 显示进程的完整命令行
top -d 2                           # 每 2 秒刷新一次
top -i                             # 忽略空闲进程,仅显示活动进程
top -s +%CPU                       # 按 CPU 使用率升序排列
top -s -%MEM                       # 按内存使用量降序排列
top -H                             # 显示线程(而非进程)信息
top -E h                           # 使用人类可读的内存格式(如 MB、GB)

htop 命令

sudo apt install htop
htop                               # 启动 htop,显示进程和资源使用情况
htop -u root                       # 显示 root 用户的进程
htop -d 2                           # 设置刷新时间间隔为 2 秒
htop -p 1234                        # 仅显示 PID 为 1234 的进程
htop --no-color                    # 禁用颜色显示
htop --sort-key PERCENT_CPU         # 按 CPU 使用率排序
htop --sort-key PERCENT_MEM         # 按内存使用率排序
htop -s cpu                         # 按 CPU 占用排序
htop -C                             # 显示 CPU 核心的详细使用情况
htop --tree                         # 按树形结构查看进程

3.2. ps 命令

ps aux                             # 查看所有进程
ps -ef                             # 查看所有进程的详细信息
ps -u root                          # 查看 root 用户的进程
ps -C sshd                          # 查看名为 sshd 的进程
ps -p 1234                           # 查看 PID 为 1234 的进程
ps --sort=-%mem                     # 按内存使用量降序排序
ps --sort=-%cpu                     # 按 CPU 使用量降序排序
ps -o pid,comm,%cpu,%mem            # 自定义输出格式,显示 PID、命令、CPU 和内存
ps ax | grep <process_name>          # 查找进程名称中包含指定字符串的进程
ps -eo pid,uid,cmd                  # 显示进程的 PID、UID 和命令行

3.3. vmstat 命令

vmstat 1                            # 每秒钟输出一次系统状态信息
vmstat 2 5                          # 每 2 秒输出一次,共输出 5 次
vmstat -s                           # 显示内存、虚拟内存、进程等详细统计信息
vmstat -d                           # 显示磁盘 I/O 的统计信息
vmstat -p                           # 显示分页相关的统计信息
vmstat -t                           # 显示时间戳
vmstat 1 10                         # 每秒输出一次,输出 10 次
vmstat -a                           # 显示内存的活动和空闲情况
vmstat -m                           # 显示内存的块信息
vmstat 1 20 | grep swap             # 输出 swap 使用信息

3.4. iostat 命令

sudo apt install sysstat
iostat                              # 显示所有设备的平均 I/O 使用情况
iostat -x 1                          # 每秒显示一次设备的详细 I/O 信息
iostat -d 2                          # 每 2 秒刷新一次磁盘 I/O 性能数据
iostat -p sda                        # 显示 /dev/sda 的 I/O 性能
iostat -c 1                          # 每秒输出一次 CPU 使用情况
iostat -t                             # 显示磁盘 I/O 和时间戳
iostat -x 1 10                       # 每秒输出一次,输出 10 次
iostat -z                             # 显示空闲设备信息
iostat -m                             # 显示以 MB 为单位的性能数据
iostat -n                             # 显示网络接口的统计信息

3.5. netstat 命令

netstat -tuln                        # 显示所有监听的端口
netstat -an                           # 显示所有网络连接,包含本地和远程地址
netstat -r                            # 显示路由表信息
netstat -p                            # 显示进程和端口绑定的关系
netstat -i                            # 显示网络接口的统计信息
netstat -s                            # 显示网络协议的统计信息
netstat -l                            # 显示所有监听端口的状态
netstat -t                             # 显示所有 TCP 连接的状态
netstat -u                             # 显示所有 UDP 连接的状态
netstat -c                             # 每秒刷新一次显示网络连接

3.6. sar 命令

sar -u 1 5                           # 每秒输出一次 CPU 使用情况,输出 5 次
sar -r 1 5                           # 每秒输出一次内存使用情况,输出 5 次
sar -n DEV 1 5                       # 每秒输出一次网络接口的使用情况
sar -d 1 5                           # 每秒输出一次磁盘设备的 I/O 性能
sar -q                               # 显示队列长度的统计信息
sar -b                               # 显示缓冲区的使用情况
sar -B                               # 显示交换空间的统计信息
sar -v                               # 显示系统版本信息
sar -p                               # 显示进程的状态
sar -f /var/log/sa/sa01              # 查看指定日期的历史数据

7. dstat 命令

sudo apt install dstat
dstat                                # 显示所有系统资源的实时使用情况
dstat -cdng                          # 显示 CPU、磁盘、网络和页交换使用情况
dstat -t                              # 显示时间戳
dstat -r                              # 显示磁盘的读写情况
dstat -m                              # 显示内存使用情况
dstat -n                              # 显示网络的实时流量
dstat -p                              # 显示进程的 CPU 使用情况
dstat -l                              # 显示系统的负载情况
dstat -g                              # 显示进程生成/销毁的数量
dstat -s                              # 显示系统状态摘要

3.8. uptime 命令

uptime                                 # 查看系统运行时间、负载等信息
uptime -p                              # 显示系统运行时间(例如:up 10 days, 3:21)
uptime -s                              # 显示系统的启动时间
uptime -V                              # 显示 uptime 命令的版本
uptime -w                              # 显示负载均衡的数据(此选项已过期)

3.9. smartctl 命令

smartctl -a /dev/sda                   # 查看磁盘的 S.M.A.R.T. 状态
smartctl -t short /dev/sda             # 执行短时间 S.M.A.R.T. 测试
smartctl -t long /dev/sda              # 执行长时间 S.M.A.R.T. 测试
smartctl -x /dev/sda                   # 获取更详细的 S.M.A.R.T. 数据
smartctl -H /dev/sda                   # 检查磁盘健康状态
smartctl -l selftest /dev/sda          # 显示磁盘自检记录
smartctl -s on /dev/sda                # 启用磁盘的 S.M.A.R.T. 功能
smartctl -s off /dev/sda               # 禁用磁盘的 S.M.A.R.T. 功能
smartctl -a /dev/sdb                   # 查看另一个磁盘的状态
smartctl -S /dev/sda                   # 显示磁盘的电源状态

3.10. journalctl 命令

journalctl                            # 查看所有的系统日志
journalctl -u sshd                    # 查看 sshd 服务的日志
journalctl -f                         # 实时查看日志输出
journalctl -p err                     # 显示所有错误级别的日志
journalctl --since "2023-10-01"        # 查看指定日期后的日志
journalctl --

3.11. 作业命令

在 Linux 系统中,作业(Job)指的是在当前终端中运行的进程。通过作业相关的命令,你可以管理这些进程,包括在后台运行、暂停、恢复、结束等。以下是 Linux 中与作业管理相关的命令和它们的使用示例:

3.111. bg - 将作业放入后台运行

bg 命令用于将停止的作业(使用 Ctrl+Z 停止的作业)恢复到后台继续运行。

  1. 假设你有一个正在运行但被暂停的进程(比如一个 sleep 命令):
    sleep 1000 # 运行 sleep 命令,假设你按下了 Ctrl+Z 暂停它
  2. 使用 bg 恢复该作业并将其放入后台运行:
    bg %1 # 其中 %1 是作业编号,表示恢复第 1 个作业
  3. 如果没有指定作业编号,bg 会将最近停止的作业放入后台:
    bg

3.11.2. fg - 将作业带回前台运行

fg 命令用于将后台运行的作业带回前台继续运行,通常用于与 bg 命令相对使用。

  1. 如果你之前有一个后台进程(如通过 bg 放入后台的 sleep 命令),你可以通过以下命令将它带回前台:
    fg %1 # 将作业编号为 1 的作业带回前台
  2. 如果没有指定作业编号,fg 会将最近的后台作业带回前台:
    fg

3.11.3. jobs - 查看当前作业

jobs 命令用于显示当前终端下的所有作业状态,包括它们的编号、状态和命令。

  1. 列出所有当前作业的状态:
    jobs
  2. 输出示例:
    [1]+ 1234 Stopped sleep 1000 [2] 1235 Running sleep 1000 &
  • Stopped:表示进程被暂停。

  • Running:表示进程在后台运行。


3.11.4. kill - 终止作业

kill 命令用于终止一个作业,通常通过进程号(PID)来指定,或者通过作业编号来指定。

  1. 通过进程号(PID)终止作业:
    kill 1234 # 终止 PID 为 1234 的进程
  2. 通过作业编号终止作业:
    kill %1 # 终止作业编号为 1 的作业
  3. 强制终止作业:
    kill -9 %1 # 强制终止作业编号为 1 的作业

3.11.5. nohup - 在后台运行命令并忽略挂起信号

nohup(No Hang Up)命令用于让一个命令在退出 shell 后继续运行,通常用于需要长期运行的作业(如脚本、服务等)。

  1. 使用 nohup 启动一个后台进程,并将输出重定向到文件:
    nohup long_running_process > output.log 2>&1 &
  2. 解释:
  • nohup:使命令在 shell 关闭后仍然运行。

  • &:将命令放到后台。

  • > output.log 2>&1:将标准输出和标准错误重定向到 output.log 文件。


3.11.6. disown - 从 shell 作业表中移除作业

disown 命令用于从当前 shell 会话的作业表中移除一个作业,这样该作业就不再与当前 shell 关联,通常与后台运行作业配合使用。

  1. 将某个后台作业从作业表中移除:
    disown %1 # 移除作业编号为 1 的作业
  2. 如果不指定作业编号,disown 会移除当前后台作业:
    disown
    这时,该作业就不会在 shell 退出时被杀死,它会继续在后台运行。

3.11.7. at - 延时执行命令

at 命令用于安排在指定时间执行一个命令,通常用于定时作业或延迟执行。

  1. 使用 at 在当前时间 1 分钟后执行一个命令:
    echo "sleep 1000" | at now + 1 minute
  2. 你也可以在特定的时间点执行:
    echo "echo 'Hello, World!'" | at 14:00 # 每天 14:00 执行
  3. 查看已安排的作业:
    atq
  4. 删除某个作业:
    atrm 1 # 删除作业编号为 1 的作业

3.11.8. cron - 定时任务

cron 是 Linux 中用于定时执行作业的服务,适用于定期执行任务。

  1. 编辑 cron 作业:
    crontab -e # 编辑当前用户的定时任务
  2. 在 crontab 文件中添加任务,例如每天午夜执行一个脚本:
    0 0 * * * /path/to/script.sh
  3. 查看当前用户的 cron 作业:
    crontab -l
  4. 删除当前用户的所有 cron 作业:
    crontab -r

3.11.9. time - 测量命令执行时间

time 命令用于测量一个命令执行所需的时间,通常用于性能调试。

  1. 测量命令的执行时间:
    time sleep 5
    输出示例:
    real 0m5.003s user 0m0.000s sys 0m0.002s
  • real:实际经过的时间。

  • user:在用户态运行的时间。

  • sys:在内核态运行的时间。


3.11.10. wait - 等待作业完成

wait 命令用于等待后台作业的结束,并返回其退出状态。

  1. 使用 wait 等待后台作业完成:
    sleep 5 & wait ! # 等待最后一个后台作业完成 这里,`!` 获取最近一个后台作业的进程号。

写在最后

本篇主要目标是告诉大家怎么查看本机的进程状态和一些指标信息