如何将topas用作脚本工具并在bash脚本中抓取其全量数据
Topas脚本化调用及全输出抓取实现方案
原有命令失效原因
topas -bnl未指定输出轮次参数时,会持续按默认间隔循环输出监控数据,不会自动退出,直接在脚本中调用会导致进程永久挂起,无法拿到完整输出- 直接搭配
head做管道截断时,topas在非终端环境下默认开启块缓冲,不会实时输出内容,最终拿到的要么是空数据,要么是被截断的残缺内容 - 未加纯文本输出参数时,topas会输出终端控制转义字符(清屏、光标移动指令),重定向抓取的内容会夹杂乱码,无法直接做文本处理
脚本调用的必选参数说明
脚本场景下调用topas必须凑齐以下参数,才能稳定输出可解析的纯文本内容:
-b:开启批处理模式,禁用所有交互热键、UI动态渲染逻辑-n <轮次数>:指定输出的监控快照数量,输出完指定轮次后topas会自动退出,是脚本调用必须添加的参数-l:禁用所有终端转义控制字符,输出纯文本内容,避免乱码-i <间隔秒数>:可选,指定多轮快照之间的间隔时间,单轮抓取时设为1即可,无需长时间等待
Bash脚本抓取全量输出的可用示例
基础调用命令
单轮抓取全量监控数据,执行后自动退出,无乱码:
topas -bnl -i 1 -n 1
输出捕获写法
如果需要把输出存入变量或写入文件,追加stdbuf关闭块缓冲,避免输出截断:
#!/bin/bash # 全量输出捕获到变量,包含标准错误流内容 topas_full_data=$(stdbuf -oL -eL topas -bnl -i 1 -n 1 2>&1) # 全量输出写入日志文件 stdbuf -oL -eL topas -bnl -i 1 -n 1 > ./topas_monitor.log 2>&1
参数说明:
stdbuf -oL -eL:强制topas的标准输出、标准错误流使用行缓冲,解决重定向/管道场景下的块缓冲导致的内容缺失问题2>&1:将标准错误流合并到标准输出,避免硬件告警、权限提示类内容丢失- 如需连续抓取多轮快照,修改
-n后的数值即可,例如-n 10 -i 2代表每2秒抓取1次,累计输出10次快照后自动退出
搭配head截断的正确写法
如果只需要输出的前N行内容,不要直接管道接head,否则会因缓冲问题拿不到内容,正确写法如下:
# 取topas输出的前50行 stdbuf -oL topas -bnl -i 1 -n 1 | head -n 50
常见注意事项
- 禁止在脚本中调用不带
-n参数的topas,会导致脚本永久挂起 - 不要省略
-l参数,否则抓取的内容会夹杂^[[H^[[2J类清屏转义字符,无法正常做文本解析 - AIX系统下部分版本topas需要root权限才能输出全量进程、分区监控数据,普通用户运行会缺失部分监控字段
内容的提问来源于stack exchange,提问作者Superman N
相关产品推荐
相关产品推荐

