首页 > 其他分享 >Golang初学:获取主机的磁盘空间信息,gopsutil

Golang初学:获取主机的磁盘空间信息,gopsutil

时间:2024-05-23 14:19:09浏览次数:27  
标签:github 获取 fmt Golang 磁盘空间 go com gopsutil

go version go1.22.1 windows/amd64

Windows 11 + amd64

x86_64 x86_64 GNU/Linux

---

 

序章

怎么获取磁盘空间信息呢?总量、剩余等。包括,Windows、Linux主机等。

使用标准库(os、fs、syscall 等)可以吗?可以,网上可以找到 获取 Linux 系统的相关信息,不过,要获取 Windows 的就比较麻烦了。

咨询了 通义千问,可以使用 github.com/shirou/gopsutil/disk 来获取相关信息。

 

获取磁盘空间剩余信息,对于需要使用 磁盘存储文件是有用的。

不过,一般磁盘空间会有专门的工具监控的。

--

另外还想获取 主机总内存信息,真难!通过标准库获取没成功。一般来说,golang 程序是运行在 容器中,容器启动时就已经限制了内存了,是否获取主机内存,获取用处也不大。

 

使用 第三方模块 获取磁盘信息

go get

进入项目目录,获取:ben发布于博客园

> go get -u github.com/shirou/gopsutil/disk
go: downloading github.com/shirou/gopsutil v2.21.11+incompatible
go: downloading github.com/yusufpapurcu/wmi v1.2.4
go: downloading github.com/go-ole/go-ole v1.2.6
go: downloading github.com/go-ole/go-ole v1.3.0
go: added github.com/go-ole/go-ole v1.3.0
go: added github.com/shirou/gopsutil v2.21.11+incompatible
go: added github.com/yusufpapurcu/wmi v1.2.4

得到了 github.com/shirou/gopsutil v2.21.11+incompatible // indirect 及其依赖包。

 

使用:Windows、Linux

上代码:

// Disk info
func GetDiskInfo() {
	// github.com/shirou/gopsutil/disk
	fmt.Println("using github.com/shirou/gopsutil/disk")
    // #1 获取分区
	parts, err := disk.Partitions(true)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(parts)
	fmt.Println("type=", reflect.TypeOf(parts), "size=", len(parts))

	for _, part := range parts {
        // #2 Linux 特别处理
		// don't use Yoda conditions (ST1017)
		if runtime.GOOS == "linux" && part.Mountpoint != "/" {
			// Ignoring
			continue
		}

        // #3 获取挂载点的使用信息
		usage, err := disk.Usage((part.Mountpoint))
		if err != nil {
			fmt.Println(err)
			continue
		}

        // #4 打印某挂载点的磁盘使用
		fmt.Printf("Part: %s\n", part.Device)
		fmt.Printf("Total: %d bytes\n", usage.Total)
		fmt.Printf("Free: %d bytes\n", usage.Free)
		fmt.Printf("Usedd: %d bytes\n", usage.Used)
		fmt.Println()
	}

}

 

测试结果

Windows:

using github.com/shirou/gopsutil/disk
[{"device":"C:","mountpoint":"C:","fstype":"NTFS","opts":"rw.compress"} {"device":"D:","mountpoint":"D:","fstype":"NTFS","opts":"rw.compress"}]
type= []disk.PartitionStat size= 2
Part: C:
Total: 127986036736 bytes
Free: 62972157952 bytes
Usedd: 65013878784 bytes

Part: D:
Total: 126805340160 bytes
Free: 61864873984 bytes
Usedd: 64940466176 bytes

只有 2个 挂载点,输出正确。ben发布于博客园

 

Linux(ECS):

没有代码中的 #2 时,打印了 36 条信息,其中包括不少 cgroup的,但空间为 0。

经过特别处理——只输出 挂载点(/)的,如下:

type= []disk.PartitionStat size= 36
Part: /dev/vda1
Total: 42090295296 bytes
Free: 30521069568 bytes
Usedd: 9619828736 bytes

注,上面的 /dev/vda1 挂在到了 /。可以使用 df -h 查看更多挂载点信息,不过,df 命令查询到的 不包括 一些 cgroup 的挂载点。

 

可能的其它方式

既然 df -h 可以获取 Linux 磁盘信息,是否可以通过 执行命令来获取呢?

cmd := exec.Command("df -h")

?TODO

 

END.

ben发布于博客园

本文链接:

https://www.cnblogs.com/luo630/p/18208289

ben发布于博客园

参考资料

1、通义千问

https://tongyi.aliyun.com/qianwen/

2、

 

ben发布于博客园

ben发布于博客园

 

标签:github,获取,fmt,Golang,磁盘空间,go,com,gopsutil
From: https://www.cnblogs.com/luo630/p/18208289

相关文章

  • golang微服务之go-zero零基础实战
    golang微服务之go-zero零基础实战1.环境准备mysql提供rpc服务接口后端交互存储etcd提供rpc服务注册与发现2.文件结构rpc服务接口:1.用户登录2.用户创建3.查询用户信息api服务接口:1.用户登录2.用户创建3.查询用户信息3.搭建步骤1.搭建rpc服务创建rpc......
  • Golang初学:vs code, launch.json, Run
    goversiongo1.22.1windows/amd64Windows11+amd64x86_64x86_64GNU/Linuxvscode1.89.1--- 序章在vscode开发go程序,之前总是在终端(terminal)输入命令(gorun.)来执行。不过,这不是最高效的方式。通过添加并配置launch.json可以更方便地程序仅运行(Ctrl+F5......
  • MySQL delete 表数据,磁盘空间不释放 ?
    最近有个上位机获取下位机上报数据的项目,由于上报频率比较频繁且数据量大,导致数据增长过快,磁盘占用多。为了节约成本,定期进行数据备份,并通过delete删除表记录。明明已经执行了delete,可表文件的大小却没减小,令人费解项目中使用MySQL作为数据库,对于表来说,一般为表结构和表数据。......
  • golang 类型断言和 var _ T = expression 写法
     类型断言(TypeAssertion)在Go语言中用于检查一个接口值的具体类型,并从中获取该类型的值。它允许你声明并访问接口变量内部存储的非接口类型的值。有两种主要的类型断言形式:value,ok:=i.(T):这种形式会检查接口i是否持有类型T的值。如果成功,value将是T类型的值,ok......
  • golang select 和外层的 for 搭配
     select语句通常与for循环搭配使用,但并不是必须的。在某些情况下,select可能会直接放在一个独立的goroutine中,没有外层的for循环。这通常发生在你知道只会有一次或有限次操作的情况下。例如,你可能有一个简单的goroutine,它等待一个特定的channel信号,然后执行一次操作:package......
  • vscode 无法调试 golang testify suite 中的单个 test 的解决办法
    目录问题描述网上的讨论最终的解决办法问题描述对于如下这样简单的测试文件:packagemain//Basicimportsimport( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite")varassertObj*assert.Assertions//Definethesuite,......
  • 连接池设计与实现一——以Golang Http1.1为例
    0.前言连接池是一个非常重要的开发思想,如httpclient会构建连接池复用底层TCP连接,使用database/sql的使用也会有连接池的配置。那么代码底层是如何实现连接池的呢?这篇文档将以Golang语言为基础,分析http1.1连接池底层实现★注意:我们仅仅关注连接池设计思想、以及关键源码解读,......
  • Linux/Golang/glibC系统调用
    Linux/Golang/glibC系统调用本文主要通过分析Linux环境下Golang的系统调用,以此阐明整个流程有时候涉略过多,反而遭到质疑~,写点文章证明自己实力也好Golang系统调用找个函数来分析https://pkg.go.dev/os/exec#Cmd.Wait源码文件在src/os目录下的:exec.go->exec_unix.go->......
  • Golang初学:获取程序内存使用情况,std runtime
    goversiongo1.22.1windows/amd64Windows11+amd64x86_64x86_64GNU/Linux--- 序章本文介绍golang程序占用内存的监控:使用stdruntime的ReadMemStats函数。 ReadMemStats函数https://pkg.go.dev/[email protected]//函数funcReadMemStats(m*MemStats......
  • golang开发
    项目目录结构democonfigconfig.goconfconfig.yamllogmain.go代码config.gopackageconfigimport("fmt""github.com/toolkits/pkg/file""github.com/toolkits/pkg/logger""os")typeCon......