Shell脚本编程——监视内存占用最高的进程

本文介绍如何使用ps和top命令监控Linux系统中内存占用较高的进程,并提供了一个简单的Shell脚本示例,用于持续记录这些进程的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    ps或top命令可用于显示前面几个MEMORY占用较多的进程。如显示前5位MEMORY占用的进程:
[root@base0:/root ]$ps aux | sort -r -k 4 | head -6 
USER PID  %CPU %MEM  VSZ  RSS  TTY  STAT  START  TIME  COMMAND
root  10079  0.3   2.7    601m  67m    ?      S    Mar11   22:42.12   monitorAgent
root  11691  1.6   0.5   17364  11m    ?      S    Mar11   114:11.01  pm_client
root  10722  0.3   0.5   19416  11m    ?      S    Mar11   3:37.21     sysmtc
root   7392   0.3   0.1   31140 3044    ?      S    Mar11   0:00.08     solid
root         1   0.0    0.0    2132   748    ?      S    Mar11   0:25.81     [init]

    其中,第四列%MEM是内存占用率,VSZ是占用的虚拟内存,RSS是占用的物理内存,单位都是kB。
    排序命令sort的几个参数:-r是倒转,由大到小;-n是不列抬头item;-k 4是以第四列%MEM为key来排列。


    如果没有显示%MEM这一列,也可通过top再按M键来实现。如下所示。
[root@base0:/root ]$top (进入top后再按M)
top - 11:51:54 up 4 days, 11:11,  1 user,  load average: 0.27, 0.37, 0.39
Tasks: 200 total,   1 running, 198 sleeping,   0 stopped,   1 zombie
Cpu(s):  0.1%us,  0.6%sy,  0.0%ni, 99.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2543164k total,  1296080k used,  1247084k free,     7388k buffers
Swap:        0k total,        0k used,        0k free,   916580k cached
  PID USER     PR  NI  VIRT  RES  SHR S  %CPU  %MEM  TIME+  COMMAND                                                                                                             
10079  root     20   0   601m   67m  4304 S  0.3  2.7  22:42.83     /usr/local/bin/monitorAgent    
11691  root     20   0   17364  11m  5496 S  1.6  0.5  114:11.45   /usr/local/bin/pm_client
10722  root     -2  -8   19416  11m  6200 S  0.3  0.5  3:37.44       /usr/local/bin/sysmtc -l 0:0:3:0:2:0 -a
 7392   root     20   0   31140 3044  2572 S  0.3  0.1  0:00.08      /usr/local/bin/solid -c /opt/database/ -x file:db.ini
 8336   root     20   0   2392  1080   768  R  0.7  0.0  0:00.27       top  
        1  root     20   0   2132   748    644  S  0.0  0.0  0:25.83       init [3]             
        2  root     20   0         0     0          0  S  0.0  0.0  0:00.23       [kthreadd]


    用ps命令连续监控内存使用较高的前5位进程,shell脚本如下:

LOG_FILE=/tmp/memory_status.log
echo "Status of the five processes that has used most memory" >> "${LOG_FILE}"
while true; do
    date >> "${LOG_FILE}"
    ps aux | sort -r -k 4 | head -6 >> "${LOG_FILE}"
    sleep 3
done


 

### Linux 下使用 Qt 监控和检查程序内存使用情况 为了在 Linux 环境下通过 Qt 查看应用程序的内存占用情况,可以采用多种方法和技术来实现这一目标。以下是几种常见且有效的方法: #### 方法一:集成 Valgrind 进行内存检测 Valgrind 是一款强大的工具集,其中包含了多个用于调试和优化的应用程序。特别是其 Memcheck 工具能够帮助开发者识别并修复各种类型的内存错误。 当希望利用 Valgrind 来监测由 Qt 编写的 C++ 应用程序时,可以通过命令行启动该应用,并指定要使用的 Valgrind 模块。例如,在终端输入如下指令即可开启一次带有详细报告的日志记录会话[^2]: ```bash valgrind --tool=memcheck --leak-check=yes ./your_qt_application ``` 这将会执行 `your_qt_application` 并生成一份关于潜在内存泄漏和其他异常行为的诊断日志文件。 #### 方法二:借助 QProcess 实现自动化测试脚本 如果想要更进一步地将上述过程融入到图形界面当中,则可考虑运用 Qt 提供的 `QProcess` 类创建子进程对象,从而允许主程序调用外部命令(如 valgrind),并将输出重定向至 GUI 组件内显示给用户查看。 下面是一个简单的例子展示了怎样构建这样一个功能模块: ```cpp #include <QApplication> #include <QWidget> #include <QTextEdit> #include <QPushButton> #include <QVBoxLayout> #include <QProcess> class MemoryMonitor : public QWidget { Q_OBJECT public: explicit MemoryMonitor(QWidget *parent = nullptr); private slots: void startMonitoring(); signals: private: QTextEdit* logOutput; QPushButton* btnStart; }; MemoryMonitor::MemoryMonitor(QWidget *parent) : QWidget(parent), logOutput(new QTextEdit(this)), btnStart(new QPushButton("Start Monitoring", this)) { QVBoxLayout* layout = new QVBoxLayout(this); layout->addWidget(logOutput); layout->addWidget(btnStart); connect(btnStart, &QPushButton::clicked, this, &MemoryMonitor::startMonitoring); } void MemoryMonitor::startMonitoring() { QProcess process; QString program = "valgrind"; QStringList arguments; arguments << "--tool=memcheck" << "--leak-check=yes" << "./path_to_your_app"; process.start(program, arguments); if (!process.waitForStarted()) { logOutput->append("Failed to start monitoring."); return; } while (process.canReadLine()) { QByteArray line = process.readLine(); logOutput->append(QString(line)); } } ``` 此代码片段定义了一个名为 `MemoryMonitor` 的窗口部件类,它内部包含有一个按钮用来触发监控流程以及一个多行编辑框负责呈现来自 Valgrind 的反馈信息。每当点击“开始监视”按键之后便会异步发起一个新的 shell 命令序列去获取最新的资源消耗统计数据[^3]。 #### 方法三:直接读取 `/proc/[pid]/status` 文件 对于那些不需要深入探究具体哪部分代码存在问题的情况来说,还可以采取更为简便的方式来粗略估计整个进程中所占有的物理 RAM 数量——即定期轮询位于 procfs 虚拟文件系统下的特定路径中的状态描述符文档。这些文本格式的数据源提供了丰富的统计指标可供解析提取有用的内容。 这里给出一段示范性的 Python 版本伪代码说明如何完成这项工作: ```python import os from time import sleep def get_memory_usage(pid=None): pid = str(os.getpid()) if not pid else str(pid) with open(f"/proc/{pid}/status") as f: lines = f.readlines() mem_info = {} for l in lines: key_value_pair = l.split(":") if len(key_value_pair) != 2 or 'Vm' not in key_value_pair[0]: continue k, v = map(str.strip, key_value_pair) mem_info[k] = int(v[:-3]) / 1e3 # Convert from kB to MB return mem_info['VmRSS'] # Return resident set size only. if __name__ == "__main__": try: while True: rss = get_memory_usage() print(f"Current RSS memory usage is {rss:.2f}MB.") sleep(5) except KeyboardInterrupt: pass ``` 这段小程序每隔五秒钟就会打印当前正在运行实例的实际驻留集合大小(Resident Set Size)。当然也可以很容易地将其转换成 C++ 或其他支持 POSIX API 的编程语言版本以便更好地适应于基于 Qt 构建的应用框架之中[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值