linux – Golang os / exec,实时内存使用情况

我正在使用 Linux,go和os / exec来运行一些命令.
我想知道一个进程’实时内存使用情况.这意味着我可以在启动进程后随时询问内存使用情况,而不仅仅是在运行之后.

(这就是为什么Measuring memory usage of executable run using golang的答案不适合我的原因)

例如:

cmd := exec.Command(...)
cmd.Start()
//...
if cmd.Memory()>50 { 
    fmt.Println("Oh my god,this process is hungry for memory!")
}

我不需要非常精确的值,但如果它的误差范围低于10兆字节则会很好.

有没有办法做到这一点,或者我需要某种命令行技巧?

解决方法

这是我在Linux上使用的内容
func calculateMemory(pid int) (uint64,error) {

    f,err := os.Open(fmt.Sprintf("/proc/%d/smaps",pid))
    if err != nil {
        return 0,err
    }
    defer f.Close()

    res := uint64(0)
    pfx := []byte("Pss:")
    r := bufio.NewScanner(f)
    for r.Scan() {
        line := r.Bytes()
        if bytes.HasPrefix(line,pfx) {
            var size uint64
            _,err := fmt.Sscanf(string(line[4:]),"%d",&size)
            if err != nil {
                return 0,err
            }
            res += size
        }
    }
    if err := r.Err(); err != nil {
        return 0,err
    }

    return res,nil
}

函数返回给定PID的PSS (Proportional Set Size),以KB表示.如果刚刚启动该过程,则应该有权访问相应的/ proc文件.

用内核3.0.13测试.

相关文章

Linux中的ARP防火墙主要用于防御ARP欺骗攻击,其效果取决于多...
insmod和modprobe加-f参数导致Invalid module format错误 这...
将ArchLinux安装到U盘 几个月前入门Arch的时候上网搜了不少安...
1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...