1
1
package psutils
2
2
3
+ import "fmt"
4
+
3
5
import (
4
6
"os"
5
7
"path/filepath"
@@ -12,13 +14,19 @@ type Process struct {
12
14
ProcessName string
13
15
}
14
16
17
+ type ProcessDetails struct {
18
+ State string
19
+ PPID int
20
+ Tgid int
21
+ }
22
+
15
23
type RealProcLoader struct {}
16
24
17
25
func (l * RealProcLoader ) Load (filePath string ) (string , error ) {
18
26
return loadFile (filePath )
19
27
}
20
28
21
- func setProcInfo (data string ) (proc Process , running bool , err error ) {
29
+ func setProcInfo (data string ) (proc Process , procDetails ProcessDetails , err error ) {
22
30
lines := strings .SplitN (data , "\n " , - 1 )
23
31
24
32
for _ , line := range lines {
@@ -36,9 +44,17 @@ func setProcInfo(data string) (proc Process, running bool, err error) {
36
44
37
45
parts := strings .Split (line , ":" )
38
46
value := strings .TrimSpace (parts [1 ])
39
- if strings .Contains (value , "R" ) {
40
- running = true
41
- }
47
+ procDetails .State = value
48
+ } else if strings .HasPrefix (line , "PPid" ) {
49
+
50
+ parts := strings .Split (line , ":" )
51
+ value := strings .TrimSpace (parts [1 ])
52
+ procDetails .PPID , err = strconv .Atoi (value )
53
+ } else if strings .HasPrefix (line , "Tgid" ) {
54
+
55
+ parts := strings .Split (line , ":" )
56
+ value := strings .TrimSpace (parts [1 ])
57
+ procDetails .Tgid , err = strconv .Atoi (value )
42
58
}
43
59
}
44
60
return
@@ -76,11 +92,29 @@ func getProcessList(loader Loader) (procs []Process, err error) {
76
92
return
77
93
}
78
94
var process Process
79
- var running bool
80
- process , running , err = setProcInfo (data )
81
- if running {
95
+ var procDetails ProcessDetails
96
+ process , procDetails , err = setProcInfo (data )
97
+ if strings . Contains ( procDetails . State , "R" ) {
82
98
procs = append (procs , process )
83
99
}
84
100
}
85
101
return
86
102
}
103
+
104
+ func GetProcessDetails (PID int ) (ProcessDetails ProcessDetails , err error ) {
105
+ var _ Loader = (* RealProcLoader )(nil )
106
+ return getProcessDetails (PID , & RealProcLoader {})
107
+ }
108
+
109
+ func getProcessDetails (PID int , loader Loader ) (ProcessDetails ProcessDetails , err error ) {
110
+
111
+ statusFile := filepath .Join ("/proc" , fmt .Sprint (PID ), "status" )
112
+ var data string
113
+ data , err = loader .Load (statusFile )
114
+ if err != nil {
115
+ return
116
+ }
117
+ _ , ProcessDetails , err = setProcInfo (data )
118
+
119
+ return
120
+ }
0 commit comments