如何使用通用Shell命令获取Linux和Mac进程的峰值内存?
跨Linux与macOS获取进程峰值内存的无依赖实现
问题根源在于Linux和macOS使用的time工具属于不同分支:Linux用的是GNU版本(/usr/bin/time),支持-f格式化参数;macOS用的是BSD shell内置版本,依赖TIMEFMT环境变量但输出格式有差异。可以通过系统分支判断实现跨平台兼容,无需额外安装依赖。
实现方案1:仅获取峰值内存数值
以下是一个可复用的shell函数,直接返回整数形式的进程峰值内存(单位KB):
get_peak_memory() { local cmd="$*" case "$(uname -s)" in Linux) # GNU time:直接输出峰值内存到stderr,转成整数 /usr/bin/time -f "%M" $cmd 2>&1 >/dev/null | awk '{print int($0)}' ;; Darwin) # BSD time:设置TIMEFMT后过滤出纯数字行,去除前导空格转整数 TIMEFMT='%M' time $cmd 2>&1 >/dev/null | grep -E '^[[:space:]]*[0-9]+$' | awk '{print int($0)}' ;; *) echo "Unsupported system" >&2 return 1 ;; esac }
使用方式
运行你的进程并获取峰值内存:
peak_mem=$(get_peak_memory myProc) echo "峰值内存:$peak_mem KB"
实现方案2:整合原有日志/输出逻辑
如果你需要保留原逻辑中的tee memory和日志追加操作,可以使用以下版本:
run_and_get_peak() { local log_file="$1" shift local cmd="$*" local peak_mem case "$(uname -s)" in Linux) # 保留进程stdout到memory文件和日志,捕获time的峰值输出 peak_mem=$(/usr/bin/time -f "%M" $cmd 2>&1 > >(tee memory | tail -n1 >> "$log_file")) peak_mem=$(echo "$peak_mem" | awk '{print int($0)}') ;; Darwin) # BSD time:捕获所有输出,分离进程stdout和time的峰值数据 local time_output=$(TIMEFMT='%M' time $cmd 2>&1 > >(tee memory | tail -n1 >> "$log_file")) peak_mem=$(echo "$time_output" | grep -E '^[[:space:]]*[0-9]+$' | awk '{print int($0)}') ;; *) echo "Unsupported system" >&2 return 1 ;; esac echo "$peak_mem" }
使用方式
传入日志文件路径和你的进程命令:
peak=$(run_and_get_peak "$log" myProc) echo "进程峰值内存:$peak KB"
关键细节说明
uname -s:通过内核名称识别系统,Linux返回Linux,macOS返回Darwin- Linux下必须使用
/usr/bin/time(GNU版本),避免调用shell内置的time(不支持-f参数) - macOS下
TIMEFMT='%M'会让内置time仅输出峰值内存,但输出带前导空格,需用grep过滤纯数字行后转整数
内容的提问来源于stack exchange,提问作者AC-93
相关产品推荐
相关产品推荐

