mirror of
https://github.com/shirou/gopsutil.git
synced 2025-05-08 19:29:25 +08:00
Merge branch 'master' of github.com:shirou/gopsutil
This commit is contained in:
commit
f5a85e6b55
@ -102,7 +102,7 @@ Current Status
|
||||
- disk_partitions (linux, freebsd, windows)
|
||||
- disk_io_counters (linux)
|
||||
- disk_usage (linux, freebsd, windows)
|
||||
- net_io_counters (linux, windows)
|
||||
- net_io_counters (linux, freebsd, windows)
|
||||
- boot_time (linux, freebsd, windows(but little broken))
|
||||
- users (linux, freebsd)
|
||||
- pids (linux, freebsd)
|
||||
|
@ -58,19 +58,19 @@ func byteToString(orig []byte) string {
|
||||
}
|
||||
|
||||
// Parse to int32 without error
|
||||
func parseInt32(val string) int32 {
|
||||
func mustParseInt32(val string) int32 {
|
||||
vv, _ := strconv.ParseInt(val, 10, 32)
|
||||
return int32(vv)
|
||||
}
|
||||
|
||||
// Parse to uint64 without error
|
||||
func parseUint64(val string) uint64 {
|
||||
func mustParseUint64(val string) uint64 {
|
||||
vv, _ := strconv.ParseInt(val, 10, 64)
|
||||
return uint64(vv)
|
||||
}
|
||||
|
||||
// Parse to Float64 without error
|
||||
func parseFloat64(val string) float64 {
|
||||
func mustParseFloat64(val string) float64 {
|
||||
vv, _ := strconv.ParseFloat(val, 64)
|
||||
return vv
|
||||
}
|
||||
|
@ -62,12 +62,12 @@ func CPUInfo() ([]CPUInfoStat, error) {
|
||||
for _, line := range lines {
|
||||
if matches := regexp.MustCompile(`CPU:\s+(.+) \(([\d.]+).+\)`).FindStringSubmatch(line); matches != nil {
|
||||
c.ModelName = matches[1]
|
||||
c.Mhz = parseFloat64(matches[2])
|
||||
c.Mhz = mustParseFloat64(matches[2])
|
||||
} else if matches := regexp.MustCompile(`Origin = "(.+)" Id = (.+) Family = (.+) Model = (.+) Stepping = (.+)`).FindStringSubmatch(line); matches != nil {
|
||||
c.VendorID = matches[1]
|
||||
c.Family = matches[3]
|
||||
c.Model = matches[4]
|
||||
c.Stepping = parseInt32(matches[5])
|
||||
c.Stepping = mustParseInt32(matches[5])
|
||||
} else if matches := regexp.MustCompile(`Features=.+<(.+)>`).FindStringSubmatch(line); matches != nil {
|
||||
for _, v := range strings.Split(matches[1], ",") {
|
||||
c.Flags = append(c.Flags, strings.ToLower(v))
|
||||
@ -78,7 +78,7 @@ func CPUInfo() ([]CPUInfoStat, error) {
|
||||
}
|
||||
} else if matches := regexp.MustCompile(`Logical CPUs per core: (\d+)`).FindStringSubmatch(line); matches != nil {
|
||||
// FIXME: no this line?
|
||||
c.Cores = parseInt32(matches[1])
|
||||
c.Cores = mustParseInt32(matches[1])
|
||||
}
|
||||
|
||||
}
|
||||
|
10
cpu_linux.go
10
cpu_linux.go
@ -46,7 +46,7 @@ func CPUInfo() ([]CPUInfoStat, error) {
|
||||
switch key {
|
||||
case "processor":
|
||||
c = CPUInfoStat{}
|
||||
c.CPU = parseInt32(value)
|
||||
c.CPU = mustParseInt32(value)
|
||||
case "vendor_id":
|
||||
c.VendorID = value
|
||||
case "cpu family":
|
||||
@ -56,17 +56,17 @@ func CPUInfo() ([]CPUInfoStat, error) {
|
||||
case "model name":
|
||||
c.ModelName = value
|
||||
case "stepping":
|
||||
c.Stepping = parseInt32(value)
|
||||
c.Stepping = mustParseInt32(value)
|
||||
case "cpu MHz":
|
||||
c.Mhz = parseFloat64(value)
|
||||
c.Mhz = mustParseFloat64(value)
|
||||
case "cache size":
|
||||
c.CacheSize = parseInt32(strings.Replace(value, " KB", "", 1))
|
||||
c.CacheSize = mustParseInt32(strings.Replace(value, " KB", "", 1))
|
||||
case "physical id":
|
||||
c.PhysicalID = value
|
||||
case "core id":
|
||||
c.CoreID = value
|
||||
case "cpu cores":
|
||||
c.Cores = parseInt32(value)
|
||||
c.Cores = mustParseInt32(value)
|
||||
case "flags":
|
||||
c.Flags = strings.Split(value, ",")
|
||||
}
|
||||
|
@ -69,12 +69,12 @@ func DiskIOCounters() (map[string]DiskIOCountersStat, error) {
|
||||
for _, line := range lines {
|
||||
fields := strings.Fields(line)
|
||||
name := fields[2]
|
||||
reads := parseUint64(fields[3])
|
||||
rbytes := parseUint64(fields[5])
|
||||
rtime := parseUint64(fields[6])
|
||||
writes := parseUint64(fields[7])
|
||||
wbytes := parseUint64(fields[9])
|
||||
wtime := parseUint64(fields[10])
|
||||
reads := mustParseUint64(fields[3])
|
||||
rbytes := mustParseUint64(fields[5])
|
||||
rtime := mustParseUint64(fields[6])
|
||||
writes := mustParseUint64(fields[7])
|
||||
wbytes := mustParseUint64(fields[9])
|
||||
wtime := mustParseUint64(fields[10])
|
||||
if stringContains(partitions, name) {
|
||||
d := DiskIOCountersStat{
|
||||
Name: name,
|
||||
|
2
host.go
2
host.go
@ -8,7 +8,7 @@ import (
|
||||
// This is not in the psutil but it useful.
|
||||
type HostInfoStat struct {
|
||||
Hostname string `json:"hostname"`
|
||||
Uptime int64 `json:"uptime"`
|
||||
Uptime uint64 `json:"uptime"`
|
||||
Procs uint64 `json:"procs"` // number of processes
|
||||
OS string `json:"os"` // ex: freebsd, linux
|
||||
Platform string `json:"platform"` // ex: ubuntu, linuxmint
|
||||
|
@ -7,19 +7,41 @@ import (
|
||||
"encoding/binary"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"os/exec"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
func HostInfo() (*HostInfoStat, error) {
|
||||
ret := &HostInfoStat{}
|
||||
ret := &HostInfoStat{
|
||||
OS: runtime.GOOS,
|
||||
PlatformFamily: "freebsd",
|
||||
}
|
||||
|
||||
hostname, err := os.Hostname()
|
||||
ret.Hostname = hostname
|
||||
if err != nil {
|
||||
return ret, err
|
||||
}
|
||||
ret.Hostname = hostname
|
||||
|
||||
out, err := exec.Command("uname", "-s").Output()
|
||||
if err == nil {
|
||||
ret.Platform = strings.ToLower(strings.TrimSpace(string(out)))
|
||||
}
|
||||
|
||||
out, err = exec.Command("uname", "-r").Output()
|
||||
if err == nil {
|
||||
ret.PlatformVersion = strings.ToLower(strings.TrimSpace(string(out)))
|
||||
}
|
||||
|
||||
values, err := doSysctrl("kern.boottime")
|
||||
if err == nil {
|
||||
// ex: { sec = 1392261637, usec = 627534 } Thu Feb 13 12:20:37 2014
|
||||
v := strings.Replace(values[2], ",", "", 1)
|
||||
ret.Uptime = mustParseUint64(v)
|
||||
}
|
||||
|
||||
return ret, nil
|
||||
}
|
||||
|
@ -38,16 +38,20 @@ func HostInfo() (*HostInfoStat, error) {
|
||||
ret.PlatformFamily = family
|
||||
ret.PlatformVersion = version
|
||||
}
|
||||
uptime, err := BootTime()
|
||||
if err == nil {
|
||||
ret.Uptime = uptime
|
||||
}
|
||||
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
func BootTime() (int64, error) {
|
||||
func BootTime() (uint64, error) {
|
||||
sysinfo := &syscall.Sysinfo_t{}
|
||||
if err := syscall.Sysinfo(sysinfo); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return int64(sysinfo.Uptime), nil
|
||||
return uint64(sysinfo.Uptime), nil
|
||||
}
|
||||
|
||||
func Users() ([]UserStat, error) {
|
||||
|
@ -26,7 +26,7 @@ func HostInfo() (*HostInfoStat, error) {
|
||||
return ret, syscall.GetLastError()
|
||||
}
|
||||
|
||||
ret.Uptime = int64(uptimemsec) / 1000
|
||||
ret.Uptime = uint64(uptimemsec) / 1000
|
||||
|
||||
procs, err := Pids()
|
||||
if err != nil {
|
||||
@ -38,7 +38,7 @@ func HostInfo() (*HostInfoStat, error) {
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
func BootTime() (int64, error) {
|
||||
func BootTime() (uint64, error) {
|
||||
var lpSystemTimeAsFileTime FILETIME
|
||||
|
||||
r, _, _ := procGetSystemTimeAsFileTime.Call(uintptr(unsafe.Pointer(&lpSystemTimeAsFileTime)))
|
||||
@ -56,7 +56,7 @@ func BootTime() (int64, error) {
|
||||
}
|
||||
uptime := uint64(u) / 1000
|
||||
|
||||
return int64(pt - uptime), nil
|
||||
return uint64(pt - uptime), nil
|
||||
}
|
||||
func Users() ([]UserStat, error) {
|
||||
|
||||
|
@ -10,7 +10,7 @@ import (
|
||||
func VirtualMemory() (*VirtualMemoryStat, error) {
|
||||
|
||||
pageSize, _ := doSysctrl("vm.stats.vm.v_page_size")
|
||||
p := parseUint64(pageSize[0])
|
||||
p := mustParseUint64(pageSize[0])
|
||||
|
||||
pageCount, _ := doSysctrl("vm.stats.vm.v_page_count")
|
||||
free, _ := doSysctrl("vm.stats.vm.v_free_count")
|
||||
@ -21,13 +21,13 @@ func VirtualMemory() (*VirtualMemoryStat, error) {
|
||||
wired, _ := doSysctrl("vm.stats.vm.v_wire_count")
|
||||
|
||||
ret := &VirtualMemoryStat{
|
||||
Total: parseUint64(pageCount[0]) * p,
|
||||
Free: parseUint64(free[0]) * p,
|
||||
Active: parseUint64(active[0]) * p,
|
||||
Inactive: parseUint64(inactive[0]) * p,
|
||||
Cached: parseUint64(cache[0]) * p,
|
||||
Buffers: parseUint64(buffer[0]),
|
||||
Wired: parseUint64(wired[0]) * p,
|
||||
Total: mustParseUint64(pageCount[0]) * p,
|
||||
Free: mustParseUint64(free[0]) * p,
|
||||
Active: mustParseUint64(active[0]) * p,
|
||||
Inactive: mustParseUint64(inactive[0]) * p,
|
||||
Cached: mustParseUint64(cache[0]) * p,
|
||||
Buffers: mustParseUint64(buffer[0]),
|
||||
Wired: mustParseUint64(wired[0]) * p,
|
||||
}
|
||||
|
||||
// TODO: platform independent (worked freebsd?)
|
||||
@ -57,10 +57,10 @@ func SwapMemory() (*SwapMemoryStat, error) {
|
||||
u := strings.Replace(values[4], "%", "", 1)
|
||||
|
||||
ret = &SwapMemoryStat{
|
||||
Total: parseUint64(values[1]),
|
||||
Used: parseUint64(values[2]),
|
||||
Free: parseUint64(values[3]),
|
||||
UsedPercent: parseFloat64(u),
|
||||
Total: mustParseUint64(values[1]),
|
||||
Used: mustParseUint64(values[2]),
|
||||
Free: mustParseUint64(values[3]),
|
||||
UsedPercent: mustParseFloat64(u),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3,9 +3,43 @@
|
||||
package gopsutil
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os/exec"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func NetIOCounters(pernic bool) ([]NetIOCountersStat, error) {
|
||||
return nil, errors.New("not implemented yet")
|
||||
out, err := exec.Command("/usr/bin/netstat", "-ibdn").Output()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
lines := strings.Split(string(out), "\n")
|
||||
ret := make([]NetIOCountersStat, 0, len(lines)-1)
|
||||
|
||||
for _, line := range lines {
|
||||
values := strings.Fields(line)
|
||||
if len(values) < 1 || values[0] == "Name" {
|
||||
continue
|
||||
}
|
||||
base := 1
|
||||
// sometimes Address is ommitted
|
||||
if len(values) < 13 {
|
||||
base = 0
|
||||
}
|
||||
|
||||
n := NetIOCountersStat{
|
||||
Name: values[0],
|
||||
PacketsRecv: mustParseUint64(values[base+3]),
|
||||
Errin: mustParseUint64(values[base+4]),
|
||||
Dropin: mustParseUint64(values[base+5]),
|
||||
BytesRecv: mustParseUint64(values[base+6]),
|
||||
PacketsSent: mustParseUint64(values[base+7]),
|
||||
Errout: mustParseUint64(values[base+8]),
|
||||
BytesSent: mustParseUint64(values[base+9]),
|
||||
Dropout: mustParseUint64(values[base+11]),
|
||||
}
|
||||
ret = append(ret, n)
|
||||
}
|
||||
|
||||
return ret, nil
|
||||
}
|
||||
|
14
net_linux.go
14
net_linux.go
@ -24,13 +24,13 @@ func NetIOCounters(pernic bool) ([]NetIOCountersStat, error) {
|
||||
}
|
||||
nic := NetIOCountersStat{
|
||||
Name: strings.Trim(fields[0], ":"),
|
||||
BytesRecv: parseUint64(fields[1]),
|
||||
Errin: parseUint64(fields[2]),
|
||||
Dropin: parseUint64(fields[3]),
|
||||
BytesSent: parseUint64(fields[9]),
|
||||
PacketsSent: parseUint64(fields[10]),
|
||||
Errout: parseUint64(fields[11]),
|
||||
Dropout: parseUint64(fields[12]),
|
||||
BytesRecv: mustParseUint64(fields[1]),
|
||||
Errin: mustParseUint64(fields[2]),
|
||||
Dropin: mustParseUint64(fields[3]),
|
||||
BytesSent: mustParseUint64(fields[9]),
|
||||
PacketsSent: mustParseUint64(fields[10]),
|
||||
Errout: mustParseUint64(fields[11]),
|
||||
Dropout: mustParseUint64(fields[12]),
|
||||
}
|
||||
ret = append(ret, nic)
|
||||
}
|
||||
|
@ -234,25 +234,25 @@ func (p *Process) MemoryMaps(grouped bool) (*[]MemoryMapsStat, error) {
|
||||
v := strings.Trim(field[1], " kB") // remove last "kB"
|
||||
switch field[0] {
|
||||
case "Size":
|
||||
m.Size = parseUint64(v)
|
||||
m.Size = mustParseUint64(v)
|
||||
case "Rss":
|
||||
m.Rss = parseUint64(v)
|
||||
m.Rss = mustParseUint64(v)
|
||||
case "Pss":
|
||||
m.Pss = parseUint64(v)
|
||||
m.Pss = mustParseUint64(v)
|
||||
case "Shared_Clean":
|
||||
m.SharedClean = parseUint64(v)
|
||||
m.SharedClean = mustParseUint64(v)
|
||||
case "Shared_Dirty":
|
||||
m.SharedDirty = parseUint64(v)
|
||||
m.SharedDirty = mustParseUint64(v)
|
||||
case "Private_Clean":
|
||||
m.PrivateClean = parseUint64(v)
|
||||
m.PrivateClean = mustParseUint64(v)
|
||||
case "Private_Dirty":
|
||||
m.PrivateDirty = parseUint64(v)
|
||||
m.PrivateDirty = mustParseUint64(v)
|
||||
case "Referenced":
|
||||
m.Referenced = parseUint64(v)
|
||||
m.Referenced = mustParseUint64(v)
|
||||
case "Anonymous":
|
||||
m.Anonymous = parseUint64(v)
|
||||
m.Anonymous = mustParseUint64(v)
|
||||
case "Swap":
|
||||
m.Swap = parseUint64(v)
|
||||
m.Swap = mustParseUint64(v)
|
||||
}
|
||||
}
|
||||
return m
|
||||
@ -301,7 +301,7 @@ func (p *Process) fillFromfd() (int32, []*OpenFilesStat, error) {
|
||||
}
|
||||
o := &OpenFilesStat{
|
||||
Path: filepath,
|
||||
Fd: parseUint64(fd),
|
||||
Fd: mustParseUint64(fd),
|
||||
}
|
||||
openfiles = append(openfiles, o)
|
||||
}
|
||||
@ -368,13 +368,13 @@ func (p *Process) fillFromIO() (*IOCountersStat, error) {
|
||||
}
|
||||
switch field[0] {
|
||||
case "rchar":
|
||||
ret.ReadCount = parseInt32(strings.Trim(field[1], " \t"))
|
||||
ret.ReadCount = mustParseInt32(strings.Trim(field[1], " \t"))
|
||||
case "wchar":
|
||||
ret.WriteCount = parseInt32(strings.Trim(field[1], " \t"))
|
||||
ret.WriteCount = mustParseInt32(strings.Trim(field[1], " \t"))
|
||||
case "read_bytes":
|
||||
ret.ReadBytes = parseInt32(strings.Trim(field[1], " \t"))
|
||||
ret.ReadBytes = mustParseInt32(strings.Trim(field[1], " \t"))
|
||||
case "write_bytes":
|
||||
ret.WriteBytes = parseInt32(strings.Trim(field[1], " \t"))
|
||||
ret.WriteBytes = mustParseInt32(strings.Trim(field[1], " \t"))
|
||||
}
|
||||
}
|
||||
|
||||
@ -391,8 +391,8 @@ func (p *Process) fillFromStatm() (*MemoryInfoStat, *MemoryInfoExStat, error) {
|
||||
}
|
||||
fields := strings.Split(string(contents), " ")
|
||||
|
||||
rss := parseUint64(fields[0]) * PAGESIZE
|
||||
vms := parseUint64(fields[1]) * PAGESIZE
|
||||
rss := mustParseUint64(fields[0]) * PAGESIZE
|
||||
vms := mustParseUint64(fields[1]) * PAGESIZE
|
||||
memInfo := &MemoryInfoStat{
|
||||
RSS: rss,
|
||||
VMS: vms,
|
||||
@ -400,10 +400,10 @@ func (p *Process) fillFromStatm() (*MemoryInfoStat, *MemoryInfoExStat, error) {
|
||||
memInfoEx := &MemoryInfoExStat{
|
||||
RSS: rss,
|
||||
VMS: vms,
|
||||
Shared: parseUint64(fields[2]) * PAGESIZE,
|
||||
Text: parseUint64(fields[3]) * PAGESIZE,
|
||||
Lib: parseUint64(fields[4]) * PAGESIZE,
|
||||
Dirty: parseUint64(fields[5]) * PAGESIZE,
|
||||
Shared: mustParseUint64(fields[2]) * PAGESIZE,
|
||||
Text: mustParseUint64(fields[3]) * PAGESIZE,
|
||||
Lib: mustParseUint64(fields[4]) * PAGESIZE,
|
||||
Dirty: mustParseUint64(fields[5]) * PAGESIZE,
|
||||
}
|
||||
|
||||
return memInfo, memInfoEx, nil
|
||||
@ -443,18 +443,18 @@ func (p *Process) fillFromStatus() (string, string, []int32, []int32, int32, *Nu
|
||||
// case "PPid": // filled by fillFromStat
|
||||
case "Uid":
|
||||
for _, i := range strings.Split(field[1], "\t") {
|
||||
uids = append(uids, parseInt32(i))
|
||||
uids = append(uids, mustParseInt32(i))
|
||||
}
|
||||
case "Gid":
|
||||
for _, i := range strings.Split(field[1], "\t") {
|
||||
gids = append(gids, parseInt32(i))
|
||||
gids = append(gids, mustParseInt32(i))
|
||||
}
|
||||
case "Threads":
|
||||
numThreads = parseInt32(field[1])
|
||||
numThreads = mustParseInt32(field[1])
|
||||
case "voluntary_ctxt_switches":
|
||||
vol = parseInt32(field[1])
|
||||
vol = mustParseInt32(field[1])
|
||||
case "nonvoluntary_ctxt_switches":
|
||||
unvol = parseInt32(field[1])
|
||||
unvol = mustParseInt32(field[1])
|
||||
}
|
||||
}
|
||||
|
||||
@ -477,10 +477,10 @@ func (p *Process) fillFromStat() (string, int32, *CPUTimesStat, int64, int32, er
|
||||
termmap, err := getTerminalMap()
|
||||
terminal := ""
|
||||
if err == nil {
|
||||
terminal = termmap[parseUint64(fields[6])]
|
||||
terminal = termmap[mustParseUint64(fields[6])]
|
||||
}
|
||||
|
||||
ppid := parseInt32(fields[3])
|
||||
ppid := mustParseInt32(fields[3])
|
||||
utime, _ := strconv.ParseFloat(fields[13], 64)
|
||||
stime, _ := strconv.ParseFloat(fields[14], 64)
|
||||
|
||||
@ -491,10 +491,10 @@ func (p *Process) fillFromStat() (string, int32, *CPUTimesStat, int64, int32, er
|
||||
}
|
||||
|
||||
bootTime, _ := BootTime()
|
||||
ctime := ((parseUint64(fields[21]) / uint64(CLOCK_TICKS)) + uint64(bootTime)) * 1000
|
||||
ctime := ((mustParseUint64(fields[21]) / uint64(CLOCK_TICKS)) + uint64(bootTime)) * 1000
|
||||
createTime := int64(ctime)
|
||||
|
||||
// p.Nice = parseInt32(fields[18])
|
||||
// p.Nice = mustParseInt32(fields[18])
|
||||
// use syscall instead of parse Stat file
|
||||
snice, _ := syscall.Getpriority(PRIO_PROCESS, int(pid))
|
||||
nice := int32(snice) // FIXME: is this true?
|
||||
|
Loading…
x
Reference in New Issue
Block a user