1
0
Fork 0
goprocfs/pid_stat.go

243 lines
8.1 KiB
Go

package procfs
import (
"fmt"
"io/ioutil"
)
// ProcPidStat contains process information obtained from /proc/[PID]/stat
// Its fields are documented using PROC(5) man page
type ProcPidStat struct {
// The process ID.
Pid int
// The filename of the executable, in parentheses. This is visible whether
// or not the executable is swapped out.
Comm string
// One character from the string "RSDZTW" where R is running, S is sleeping
// in an interruptible wait, D is waiting in uninterruptible disk sleep, Z
// is zombie, T is traced or stopped (on a signal), and W is paging.
State string
// The PID of the parent.
Ppid int
// The process group ID of the process.
Pgrp int
// The session ID of the process.
Session int
// The controlling terminal of the process. (The minor device number is
// contained in the combination of bits 31 to 20 and 7 to 0; the major
// device number is in bits 15 to 8.)
TtyNr int
// The ID of the foreground process group of the controlling terminal of
// the process.
Tpgid int
// The kernel flags word of the process. For bit meanings, see the PF_*
// defines in the Linux kernel source file include/linux/sched.h. Details
// depend on the kernel version.
// uint32 before Linux 2.6.22
Flags uint
// The number of minor faults the process has made which have not required
// loading a memory page from disk.
Minflt uint32
// The number of minor faults that the process's waited-for children have
// made.
Cminflt uint32
// The number of major faults the process has made which have required
// loading a memory page from disk.
Majflt uint32
// The number of major faults that the process's waited-for children have
// made.
Cmajflt uint32
// Amount of time that this process has been scheduled in user mode,
// measured in clock ticks (divide by sysconf(_SC_CLK_TCK)). This includes
// guest time, guest_time (time spent running a virtual CPU, see below), so
// that applications that are not aware of the guest time field do not lose
// that time from their calculations.
Utime uint32
// Amount of time that this process has been scheduled in kernel mode,
// measured in clock ticks (divide by sysconf(_SC_CLK_TCK)).
Stime uint32
// Amount of time that this process's waited-for children have been
// scheduled in user mode, measured in clock ticks (divide by
// sysconf(_SC_CLK_TCK)). (See also times(2).) This includes guest time,
// cguest_time (time spent running a virtual CPU, see below).
Cutime int32
// Amount of time that this process's waited-for children have been
// scheduled in kernel mode, measured in clock ticks (divide by
// sysconf(_SC_CLK_TCK)).
Cstime int32
// (Explanation for Linux 2.6)
// For processes running a real-time scheduling policy (policy below; see
// sched_setscheduler(2)), this is the negated scheduling priority, minus
// one; that is, a number in the range -2 to -100, corresponding to
// real-time priorities 1 to 99. For processes running under a
// non-real-time scheduling policy, this is the raw nice value
// (setpriority(2)) as represented in the kernel. The kernel stores nice
// values as numbers in the range 0 (high) to 39 (low), corresponding to
// the user-visible nice range of -20 to 19.
// Before Linux 2.6, this was a scaled value based on the scheduler
// weighting given to this process.
Priority int32
// The nice value (see setpriority(2)), a value in the range 19 (low
// priority) to -20 (high priority).
Nice int32
// Number of threads in this process (since Linux 2.6). Before kernel 2.6,
// this field was hard coded to 0 as a placeholder for an earlier removed
// field.
NumThreads int32
// The time in jiffies before the next SIGALRM is sent to the process due
// to an interval timer. Since kernel 2.6.17, this field is no longer
// maintained, and is hard coded as 0.
Itrealvalue int32
// The time the process started after system boot. In kernels before Linux
// 2.6, this value was expressed in jiffies. Since Linux 2.6, the value is
// expressed in clock ticks (divide by sysconf(_SC_CLK_TCK)).
// (was uint32 before Linux 2.6)
Starttime uint64
// Virtual memory size in bytes.
Vsize uint32
// Resident Set Size: number of pages the process has in real memory. This
// is just the pages which count toward text, data, or stack space. This
// does not include pages which have not been demand-loaded in, or which
// are swapped out.
Rss uint64
// Current soft limit in bytes on the rss of the process; see the
// description of RLIMIT_RSS in getrlimit(2).
Rsslim uint64
// The address above which program text can run.
Startcode uint32
// The address below which program text can run.
Endcode uint32
// The address of the start (i.e., bottom) of the stack.
Startstack uint64
// The current value of ESP (stack pointer), as found in the kernel stack
// page for the process.
Kstkesp uint64
// The current EIP (instruction pointer).
Kstkeip uint32
// The bitmap of pending signals, displayed as a decimal number. Obsolete,
// because it does not provide information on real-time signals;
// use /proc/[pid]/status instead.
Signal uint32
// The bitmap of blocked signals, displayed as a decimal number. Obsolete,
// because it does not provide information on real-time signals;
// use /proc/[pid]/status instead.
Blocked uint32
// The bitmap of ignored signals, displayed as a decimal number. Obsolete,
// because it does not provide information on real-time signals;
// use /proc/[pid]/status instead.
Sigignore uint32
// The bitmap of caught signals, displayed as a decimal number. Obsolete,
// because it does not provide information on real-time signals;
// use /proc/[pid]/status instead.
Sigcatch uint32
// This is the "channel" in which the process is waiting. It is the address
// of a location in the kernel where the process is sleeping. The
// corresponding symbolic name can be found in /proc/[pid]/wchan.
Wchan uint64
// Number of pages swapped (not maintained).
Nswap uint32
// Cumulative nswap for child processes (not maintained).
Cnswap uint32
// (since Linux 2.1.22)
// Signal to be sent to parent when we die.
ExitSignal int
// (since Linux 2.2.8)
// CPU number last executed on.
Processor int
// (since Linux 2.5.19; was uint32 before Linux 2.6.22)
// Real-time scheduling priority, a number in the range 1 to 99 for
// processes scheduled under a real-time policy, or 0, for non-real-time
// processes (see sched_setscheduler(2)).
RtPriority uint
// (since Linux 2.5.19; was uint32 before Linux 2.6.22)
// Scheduling policy (see sched_setscheduler(2)). Decode using the SCHED_*
// constants in linux/sched.h.
Policy uint
// (since Linux 2.6.18)
// Aggregated block I/O delays, measured in clock ticks (centiseconds).
DelayacctBlkioTicks uint64
// (since Linux 2.6.24)
// Guest time of the process (time spent running a virtual CPU for a guest
// operating system), measured in clock ticks (divide by
// sysconf(_SC_CLK_TCK)).
GuestTime uint32
// (since Linux 2.6.24)
// Guest time of the process's children, measured in clock ticks (divide by
// sysconf(_SC_CLK_TCK)).
CguestTime int32
}
func NewProcPidStat(pid int) (ProcPidStat, error) {
p := ProcPidStat{}
file := fmt.Sprintf("/proc/%d/stat", pid)
b, err := ioutil.ReadFile(file)
if err != nil {
return p, err
}
parsed, err := fmt.Sscanf(string(b),
"%d %s %s %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d "+
"%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
&p.Pid, &p.Comm, &p.State, &p.Ppid, &p.Pgrp, &p.Session, &p.TtyNr,
&p.Tpgid, &p.Flags, &p.Minflt, &p.Cminflt, &p.Majflt, &p.Cmajflt,
&p.Utime, &p.Stime, &p.Cutime, &p.Cstime, &p.Priority, &p.Nice,
&p.NumThreads, &p.Itrealvalue, &p.Starttime, &p.Vsize, &p.Rss,
&p.Rsslim, &p.Startcode, &p.Endcode, &p.Startstack, &p.Kstkesp,
&p.Kstkeip, &p.Signal, &p.Blocked, &p.Sigignore, &p.Sigcatch, &p.Wchan,
&p.Nswap, &p.Cnswap, &p.ExitSignal, &p.Processor, &p.RtPriority,
&p.Policy, &p.DelayacctBlkioTicks, &p.GuestTime, &p.CguestTime)
if parsed < 44 {
err := fmt.Errorf("Managed to parse only %d fields out of 44", parsed)
return p, err
}
if err != nil {
return p, err
}
return p, nil
}