使用Golang从Linux的proc文件系统中提取运行时间信息

使用Golang从Linux的proc文件系统中提取运行时间信息

package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
	"strings"
)

func main() {
	file, err := os.Open("/proc/uptime")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		text := scanner.Text()
		
			fmt.Println(text)
		
	}

	if err := scanner.Err(); err != nil {
		log.Fatal(err)
	}
}

它给了我两个值,但我只需要每5秒更新的第一个正常运行时间数值


更多关于使用Golang从Linux的proc文件系统中提取运行时间信息的实战教程也可以访问 https://www.itying.com/category-94-b0.html

11 回复

非常感谢您的帮助

更多关于使用Golang从Linux的proc文件系统中提取运行时间信息的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,这是一个字符串切片。感谢您的帮助 😊

如何根据当前时间对已读取的运行时间信息进行插值计算?

请注意,正常运行时间具有每秒精确增加一秒的特性。您可以读取一次,然后根据当前时间进行插值。

尝试使用 strings.Split

parts := strings.Split(text, " ")

尝试使用 time 包来解决您的问题,您可以将运行时间的字符串表示解析为时间类型,然后利用该包的功能来实现所需操作,如下所示:

func main() {
    fmt.Println("hello world")
}

你需要遍历切片来将切片中的每个值转换为整数。

Atoi 函数可以工作,但需要配合 range 使用。

[]string 是字符串的切片,对吧?)

图片

如何将字符串转换为整数? 我尝试使用atoi但出现错误: cannot use parts (type []string) as type string in argument to strconv.Atoi

for scanner.Scan() {
    text := scanner.Text()
    parts := strings.Split(text, " ")
    i, err := strconv.Atoi(parts)
    if err != nil {
        // 处理错误
        fmt.Println(err)
        os.Exit(2)
    }
}

很抱歉我不得不这么说,但如果你无法正确处理这个错误信息,也不知道如何将 []string 转换为 string,你真的应该重新学习 Go语言之旅

此外,本论坛使用Markdown来格式化代码。这里有三种创建代码块的方法:

  1. 在编辑框中选择要标记为代码的文本,然后点击编辑框上方工具栏中的 </> 按钮
  2. 将代码块的每一行缩进4个空格(这是该按钮实际执行的操作)
  3. 将代码用"围栏"包裹起来。此Markdown处理器支持的围栏可以是至少3个反引号(```)或至少3个波浪号(~~~)。将它们放在代码块的开头和结尾。例如:
package main

尝试这个方法。它使用 strings.Split 来按空格分割行,并使用 time.Sleep 来暂停五 time.Second

package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
	"strings"
	"time"
)

func main() {
	for {
		file, err := os.Open("/proc/uptime")
		if err != nil {
			log.Fatal(err)
		}
		defer file.Close()

		scanner := bufio.NewScanner(file)
		for scanner.Scan() {
			text := scanner.Text()
			parts := strings.Split(text, " ")
			fmt.Println(parts[0])
		}

		if err := scanner.Err(); err != nil {
			log.Fatal(err)
		}

		time.Sleep(5 * time.Second)
	}

}

以下是提取/proc/uptime中第一个值(系统正常运行时间)的改进代码,该值以秒为单位表示系统自启动以来的运行时间:

package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
	"strconv"
	"strings"
	"time"
)

func getUptime() (float64, error) {
	file, err := os.Open("/proc/uptime")
	if err != nil {
		return 0, err
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	if scanner.Scan() {
		fields := strings.Fields(scanner.Text())
		if len(fields) > 0 {
			uptime, err := strconv.ParseFloat(fields[0], 64)
			if err != nil {
				return 0, err
			}
			return uptime, nil
		}
	}
	return 0, fmt.Errorf("invalid uptime format")
}

func main() {
	ticker := time.NewTicker(5 * time.Second)
	defer ticker.Stop()

	for {
		select {
		case <-ticker.C:
			uptime, err := getUptime()
			if err != nil {
				log.Printf("Error getting uptime: %v", err)
				continue
			}
			fmt.Printf("System uptime: %.2f seconds\n", uptime)
		}
	}
}

关键改进点:

  1. 创建独立的getUptime()函数专门处理uptime提取
  2. 使用strings.Fields()分割字符串获取第一个字段
  3. 使用strconv.ParseFloat()将字符串转换为浮点数
  4. 添加5秒定时器循环获取更新
  5. 错误处理更加完善

代码输出示例:

System uptime: 12345.67 seconds
System uptime: 12350.67 seconds
System uptime: 12355.67 seconds

第一个字段表示系统总运行时间(秒),第二个字段表示系统空闲时间(秒)。此代码每5秒输出一次更新的系统正常运行时间值。

回到顶部