Stefan Schuermans commited on 2020-05-24 10:00:17
Showing 1 changed files, with 74 additions and 4 deletions.
... | ... |
@@ -45,6 +45,24 @@ class Process(): |
45 | 45 |
return None |
46 | 46 |
return self._begin.cmdline |
47 | 47 |
|
48 |
+ @property |
|
49 |
+ def cpu_time(self) -> float: |
|
50 |
+ """ |
|
51 |
+ CPU time of process (in s). |
|
52 |
+ """ |
|
53 |
+ if self._end is None: |
|
54 |
+ return None |
|
55 |
+ return self._end.cpu_time |
|
56 |
+ |
|
57 |
+ @property |
|
58 |
+ def cwd(self) -> str: |
|
59 |
+ """ |
|
60 |
+ Working directory of process. |
|
61 |
+ """ |
|
62 |
+ if self._begin is None: |
|
63 |
+ return None |
|
64 |
+ return self._begin.cwd |
|
65 |
+ |
|
48 | 66 |
@property |
49 | 67 |
def end_timestamp(self) -> list: |
50 | 68 |
""" |
... | ... |
@@ -54,6 +72,33 @@ class Process(): |
54 | 72 |
return None |
55 | 73 |
return self._end.timestamp |
56 | 74 |
|
75 |
+ @property |
|
76 |
+ def environ(self) -> list: |
|
77 |
+ """ |
|
78 |
+ Environment of process. |
|
79 |
+ """ |
|
80 |
+ if self._begin is None: |
|
81 |
+ return None |
|
82 |
+ return self._begin.environ |
|
83 |
+ |
|
84 |
+ @property |
|
85 |
+ def exe(self) -> str: |
|
86 |
+ """ |
|
87 |
+ Executable of process. |
|
88 |
+ """ |
|
89 |
+ if self._begin is None: |
|
90 |
+ return None |
|
91 |
+ return self._begin.exe |
|
92 |
+ |
|
93 |
+ @property |
|
94 |
+ def max_rss_kb(self) -> int: |
|
95 |
+ """ |
|
96 |
+ Maximum resident set size of process (in KiB). |
|
97 |
+ """ |
|
98 |
+ if self._end is None: |
|
99 |
+ return None |
|
100 |
+ return self._end.max_rss_kb |
|
101 |
+ |
|
57 | 102 |
@property |
58 | 103 |
def proc_id(self): |
59 | 104 |
""" |
... | ... |
@@ -68,6 +113,24 @@ class Process(): |
68 | 113 |
""" |
69 | 114 |
return self._parent |
70 | 115 |
|
116 |
+ @property |
|
117 |
+ def sys_time(self) -> float: |
|
118 |
+ """ |
|
119 |
+ System CPU time of process (in s). |
|
120 |
+ """ |
|
121 |
+ if self._end is None: |
|
122 |
+ return None |
|
123 |
+ return self._end.sys_time |
|
124 |
+ |
|
125 |
+ @property |
|
126 |
+ def user_time(self) -> float: |
|
127 |
+ """ |
|
128 |
+ User CPU time of process (in s). |
|
129 |
+ """ |
|
130 |
+ if self._end is None: |
|
131 |
+ return None |
|
132 |
+ return self._end.user_time |
|
133 |
+ |
|
71 | 134 |
def addChild(self, child): |
72 | 135 |
""" |
73 | 136 |
Add a child process. |
... | ... |
@@ -103,8 +166,8 @@ class Processes(uproctrace.parse.Visitor): |
103 | 166 |
""" |
104 | 167 |
super().__init__() |
105 | 168 |
self._timeline = dict() # time -> list(parse.BaseEvent) |
106 |
- self._all_processes = list() # list of all processess |
|
107 |
- self._current_processes = dict() # pid -> process |
|
169 |
+ self._all_processes = dict() # proc_id -> process |
|
170 |
+ self._current_processes = dict() # pid -> process (while pid alive) |
|
108 | 171 |
self._toplevel_processes = list() # list of processes without parent |
109 | 172 |
self._readTrace(proto_file) |
110 | 173 |
|
... | ... |
@@ -112,8 +175,9 @@ class Processes(uproctrace.parse.Visitor): |
112 | 175 |
""" |
113 | 176 |
Create new process, set its PID, store it and return it. |
114 | 177 |
""" |
115 |
- proc = Process(len(self._all_processes), pid) |
|
116 |
- self._all_processes.append(proc) |
|
178 |
+ proc_id = len(self._all_processes) |
|
179 |
+ proc = Process(proc_id, pid) |
|
180 |
+ self._all_processes[proc_id] = proc |
|
117 | 181 |
return proc |
118 | 182 |
|
119 | 183 |
def _readTrace(self, proto_file): |
... | ... |
@@ -137,6 +201,12 @@ class Processes(uproctrace.parse.Visitor): |
137 | 201 |
""" |
138 | 202 |
return self._toplevel_processes.copy() |
139 | 203 |
|
204 |
+ def getProcess(self, proc_id: int): |
|
205 |
+ """ |
|
206 |
+ Return process with proc_id, or None if not found. |
|
207 |
+ """ |
|
208 |
+ return self._all_processes.get(proc_id) |
|
209 |
+ |
|
140 | 210 |
def visitProcBegin(self, proc_begin: uproctrace.parse.ProcBegin): |
141 | 211 |
""" |
142 | 212 |
Process a process begin event. |
143 | 213 |