62 lines
1.4 KiB
Fish
62 lines
1.4 KiB
Fish
#!/usr/bin/env fish
|
|
|
|
# 用法: ./mem_monitor.fish <PID> [interval_seconds=5]
|
|
# 比如: ./mem_monitor.fish 110303 5
|
|
# 会在当前目录写一个 mem_usage_110303.log,每隔5秒记录一次RSS和VSZ(单位MB)。
|
|
|
|
function usage
|
|
echo "用法: mem_monitor.fish <PID> [interval_seconds=5]"
|
|
exit 1
|
|
end
|
|
|
|
if test (count $argv) -lt 1
|
|
usage
|
|
end
|
|
|
|
set pid $argv[1]
|
|
set interval 5
|
|
if test (count $argv) -gt 1
|
|
set interval $argv[2]
|
|
end
|
|
|
|
# 输出到 mem_usage_<pid>.log
|
|
set logfile mem_usage_$pid.log
|
|
echo "写入日志: $logfile"
|
|
echo "timestamp,rss_MB,vms_MB" > $logfile
|
|
|
|
# 轮询检查
|
|
while true
|
|
# 获取 RSS/VSZ (KB) 值
|
|
# 兼容 macOS 的 ps 命令,不使用 Linux 特有的选项
|
|
set proc_line (ps -p $pid -o rss,vsz | tail -n +2 2>/dev/null)
|
|
|
|
# 若取不到(进程已退出),则停止
|
|
if test -z "$proc_line"
|
|
echo "进程 $pid 已退出或不存在."
|
|
exit 0
|
|
end
|
|
|
|
# 将单行字符串通过空格拆分为数组,如 ("79673856" "95904664")
|
|
set arr (string split ' ' (string trim $proc_line))
|
|
if test (count $arr) -lt 2
|
|
echo "解析 ps 输出时出现意外: $proc_line"
|
|
exit 1
|
|
end
|
|
|
|
# 分别赋值
|
|
set rss_kb $arr[1]
|
|
set vsz_kb $arr[2]
|
|
|
|
# 时间戳
|
|
set t (date "+%Y-%m-%d %H:%M:%S")
|
|
|
|
# 转换成 MB
|
|
set rss_MB (math "$rss_kb / 1024.0")
|
|
set vsz_MB (math "$vsz_kb / 1024.0")
|
|
|
|
# 写日志
|
|
echo "$t,$rss_MB,$vsz_MB" >> $logfile
|
|
|
|
sleep $interval
|
|
end
|