@@ -10,9 +10,7 @@ import (
10
10
"path/filepath"
11
11
"strconv"
12
12
"strings"
13
- "time"
14
13
15
- "github.com/shirou/gopsutil/v3/cpu"
16
14
"github.com/shirou/gopsutil/v3/internal/common"
17
15
"github.com/shirou/gopsutil/v3/net"
18
16
"github.com/tklauser/go-sysconf"
@@ -46,99 +44,60 @@ type _Ctype_struct___0 struct {
46
44
func pidsWithContext (ctx context.Context ) ([]int32 , error ) {
47
45
var ret []int32
48
46
49
- pids , err := callPsWithContext ( ctx , "pid" , 0 , false , false )
47
+ kprocs , err := unix . SysctlKinfoProcSlice ( "kern.proc.all" )
50
48
if err != nil {
51
49
return ret , err
52
50
}
53
51
54
- for _ , pid := range pids {
55
- v , err := strconv .Atoi (pid [0 ])
56
- if err != nil {
57
- return ret , err
58
- }
59
- ret = append (ret , int32 (v ))
52
+ for _ , proc := range kprocs {
53
+ ret = append (ret , int32 (proc .Proc .P_pid ))
60
54
}
61
55
62
56
return ret , nil
63
57
}
64
58
65
59
func (p * Process ) PpidWithContext (ctx context.Context ) (int32 , error ) {
66
- r , err := callPsWithContext (ctx , "ppid" , p .Pid , false , false )
67
- if err != nil {
68
- return 0 , err
69
- }
70
-
71
- v , err := strconv .Atoi (r [0 ][0 ])
60
+ k , err := p .getKProc ()
72
61
if err != nil {
73
62
return 0 , err
74
63
}
75
64
76
- return int32 ( v ), err
65
+ return k . Eproc . Ppid , nil
77
66
}
78
67
79
68
func (p * Process ) NameWithContext (ctx context.Context ) (string , error ) {
80
69
k , err := p .getKProc ()
81
70
if err != nil {
82
71
return "" , err
83
72
}
84
- name := common .IntToString (k .Proc .P_comm [:])
73
+
74
+ name := common .ByteToString (k .Proc .P_comm [:])
85
75
86
76
if len (name ) >= 15 {
87
77
cmdName , err := p .cmdNameWithContext (ctx )
88
78
if err != nil {
89
79
return "" , err
90
80
}
91
81
if len (cmdName ) > 0 {
92
- extendedName := filepath .Base (cmdName [ 0 ] )
82
+ extendedName := filepath .Base (cmdName )
93
83
if strings .HasPrefix (extendedName , p .name ) {
94
84
name = extendedName
95
85
} else {
96
- name = cmdName [ 0 ]
86
+ name = cmdName
97
87
}
98
88
}
99
89
}
100
90
101
91
return name , nil
102
92
}
103
93
104
- // cmdNameWithContext returns the command name (including spaces) without any arguments
105
- func (p * Process ) cmdNameWithContext (ctx context.Context ) ([]string , error ) {
106
- r , err := callPsWithContext (ctx , "command" , p .Pid , false , true )
107
- if err != nil {
108
- return nil , err
109
- }
110
- return r [0 ], err
111
- }
112
-
113
94
func (p * Process ) createTimeWithContext (ctx context.Context ) (int64 , error ) {
114
- r , err := callPsWithContext ( ctx , "etime" , p . Pid , false , false )
95
+ k , err := p . getKProc ( )
115
96
if err != nil {
116
97
return 0 , err
117
98
}
118
99
119
- elapsedSegments := strings .Split (strings .Replace (r [0 ][0 ], "-" , ":" , 1 ), ":" )
120
- var elapsedDurations []time.Duration
121
- for i := len (elapsedSegments ) - 1 ; i >= 0 ; i -- {
122
- p , err := strconv .ParseInt (elapsedSegments [i ], 10 , 0 )
123
- if err != nil {
124
- return 0 , err
125
- }
126
- elapsedDurations = append (elapsedDurations , time .Duration (p ))
127
- }
128
-
129
- elapsed := time .Duration (elapsedDurations [0 ]) * time .Second
130
- if len (elapsedDurations ) > 1 {
131
- elapsed += time .Duration (elapsedDurations [1 ]) * time .Minute
132
- }
133
- if len (elapsedDurations ) > 2 {
134
- elapsed += time .Duration (elapsedDurations [2 ]) * time .Hour
135
- }
136
- if len (elapsedDurations ) > 3 {
137
- elapsed += time .Duration (elapsedDurations [3 ]) * time .Hour * 24
138
- }
139
-
140
- start := time .Now ().Add (- elapsed )
141
- return start .Unix () * 1000 , nil
100
+ return k .Proc .P_starttime .Sec * 1000 + int64 (k .Proc .P_starttime .Usec )/ 1000 , nil
142
101
}
143
102
144
103
func (p * Process ) StatusWithContext (ctx context.Context ) ([]string , error ) {
@@ -171,7 +130,7 @@ func (p *Process) UidsWithContext(ctx context.Context) ([]int32, error) {
171
130
}
172
131
173
132
// See: http://unix.superglobalmegacorp.com/Net2/newsrc/sys/ucred.h.html
174
- userEffectiveUID := int32 (k .Eproc .Ucred .UID )
133
+ userEffectiveUID := int32 (k .Eproc .Ucred .Uid )
175
134
176
135
return []int32 {userEffectiveUID }, nil
177
136
}
@@ -183,7 +142,7 @@ func (p *Process) GidsWithContext(ctx context.Context) ([]int32, error) {
183
142
}
184
143
185
144
gids := make ([]int32 , 0 , 3 )
186
- gids = append (gids , int32 (k .Eproc .Pcred .P_rgid ), int32 (k .Eproc .Ucred . Ngroups ), int32 (k .Eproc .Pcred .P_svgid ))
145
+ gids = append (gids , int32 (k .Eproc .Pcred .P_rgid ), int32 (k .Eproc .Pcred . P_rgid ), int32 (k .Eproc .Pcred .P_svgid ))
187
146
188
147
return gids , nil
189
148
}
@@ -233,14 +192,6 @@ func (p *Process) IOCountersWithContext(ctx context.Context) (*IOCountersStat, e
233
192
return nil , common .ErrNotImplementedError
234
193
}
235
194
236
- func (p * Process ) NumThreadsWithContext (ctx context.Context ) (int32 , error ) {
237
- r , err := callPsWithContext (ctx , "utime,stime" , p .Pid , true , false )
238
- if err != nil {
239
- return 0 , err
240
- }
241
- return int32 (len (r )), nil
242
- }
243
-
244
195
func convertCPUTimes (s string ) (ret float64 , err error ) {
245
196
var t int
246
197
var _tmp string
@@ -287,56 +238,6 @@ func convertCPUTimes(s string) (ret float64, err error) {
287
238
return float64 (t ) / float64 (clockTicks ), nil
288
239
}
289
240
290
- func (p * Process ) TimesWithContext (ctx context.Context ) (* cpu.TimesStat , error ) {
291
- r , err := callPsWithContext (ctx , "utime,stime" , p .Pid , false , false )
292
- if err != nil {
293
- return nil , err
294
- }
295
-
296
- utime , err := convertCPUTimes (r [0 ][0 ])
297
- if err != nil {
298
- return nil , err
299
- }
300
- stime , err := convertCPUTimes (r [0 ][1 ])
301
- if err != nil {
302
- return nil , err
303
- }
304
-
305
- ret := & cpu.TimesStat {
306
- CPU : "cpu" ,
307
- User : utime ,
308
- System : stime ,
309
- }
310
- return ret , nil
311
- }
312
-
313
- func (p * Process ) MemoryInfoWithContext (ctx context.Context ) (* MemoryInfoStat , error ) {
314
- r , err := callPsWithContext (ctx , "rss,vsize,pagein" , p .Pid , false , false )
315
- if err != nil {
316
- return nil , err
317
- }
318
- rss , err := strconv .Atoi (r [0 ][0 ])
319
- if err != nil {
320
- return nil , err
321
- }
322
- vms , err := strconv .Atoi (r [0 ][1 ])
323
- if err != nil {
324
- return nil , err
325
- }
326
- pagein , err := strconv .Atoi (r [0 ][2 ])
327
- if err != nil {
328
- return nil , err
329
- }
330
-
331
- ret := & MemoryInfoStat {
332
- RSS : uint64 (rss ) * 1024 ,
333
- VMS : uint64 (vms ) * 1024 ,
334
- Swap : uint64 (pagein ),
335
- }
336
-
337
- return ret , nil
338
- }
339
-
340
241
func (p * Process ) ChildrenWithContext (ctx context.Context ) ([]* Process , error ) {
341
242
pids , err := common .CallPgrepWithContext (ctx , invoke , p .Pid )
342
243
if err != nil {
@@ -382,17 +283,8 @@ func ProcessesWithContext(ctx context.Context) ([]*Process, error) {
382
283
383
284
// Returns a proc as defined here:
384
285
// http://unix.superglobalmegacorp.com/Net2/newsrc/sys/kinfo_proc.h.html
385
- func (p * Process ) getKProc () (* KinfoProc , error ) {
386
- buf , err := unix .SysctlRaw ("kern.proc.pid" , int (p .Pid ))
387
- if err != nil {
388
- return nil , err
389
- }
390
- k , err := parseKinfoProc (buf )
391
- if err != nil {
392
- return nil , err
393
- }
394
-
395
- return & k , nil
286
+ func (p * Process ) getKProc () (* unix.KinfoProc , error ) {
287
+ return unix .SysctlKinfoProc ("kern.proc.pid" , int (p .Pid ))
396
288
}
397
289
398
290
// call ps command.
0 commit comments