使用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
非常感谢您的帮助
更多关于使用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来格式化代码。这里有三种创建代码块的方法:
- 在编辑框中选择要标记为代码的文本,然后点击编辑框上方工具栏中的
</>按钮 - 将代码块的每一行缩进4个空格(这是该按钮实际执行的操作)
- 将代码用"围栏"包裹起来。此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)
}
}
}
关键改进点:
- 创建独立的
getUptime()函数专门处理uptime提取 - 使用
strings.Fields()分割字符串获取第一个字段 - 使用
strconv.ParseFloat()将字符串转换为浮点数 - 添加5秒定时器循环获取更新
- 错误处理更加完善
代码输出示例:
System uptime: 12345.67 seconds
System uptime: 12350.67 seconds
System uptime: 12355.67 seconds
第一个字段表示系统总运行时间(秒),第二个字段表示系统空闲时间(秒)。此代码每5秒输出一次更新的系统正常运行时间值。

