linux_stat 0.3.3 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +134 -32
- data/bin/linuxstat.rb +1 -0
- data/ext/fs_stat/fs_stat.c +2 -1
- data/ext/sysconf/extconf.rb +7 -0
- data/ext/sysconf/sysconf.c +53 -0
- data/ext/utsname/utsname.c +25 -5
- data/lib/linux_stat.rb +4 -1
- data/lib/linux_stat/battery.rb +2 -2
- data/lib/linux_stat/bios.rb +10 -6
- data/lib/linux_stat/cpu.rb +10 -2
- data/lib/linux_stat/filesystem.rb +5 -7
- data/lib/linux_stat/kernel.rb +15 -6
- data/lib/linux_stat/memory.rb +8 -2
- data/lib/linux_stat/os.rb +11 -9
- data/lib/linux_stat/process_info.rb +310 -0
- data/lib/linux_stat/swap.rb +6 -1
- data/lib/linux_stat/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4f9b433758109c632c7b6358b1fd6c5cda1711e1ab6b8f4a3dae0ce6cc02f6d
|
4
|
+
data.tar.gz: c0273b6cf31ae022adfeb4b9e041426de2841899d08be49f3559ab98175be54d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e7b971800222420d9156a791de5857331c923149416a7d4b5d025d57bbb7e9d3ccea8ec47d2236f308a8675bfbcf5d0a2ee0380dab92afed29dc0ace8dcb577
|
7
|
+
data.tar.gz: 7583db616fff644f2798fe779b23ed28cc762eac3d6d8aad0e4c907b21813bcaacc058570516378e7cdf495a51b4906bb5a30221ebb60536af72d91b2795a147
|
data/README.md
CHANGED
@@ -99,7 +99,7 @@ LinuxStat::CPU.count
|
|
99
99
|
=> 4
|
100
100
|
|
101
101
|
LinuxStat::CPU.cur_freq
|
102
|
-
=> [
|
102
|
+
=> [1999998, 2000003, 2000015, 2000009]
|
103
103
|
|
104
104
|
LinuxStat::CPU.max_freq
|
105
105
|
=> [2000000, 2000000, 2000000, 2000000]
|
@@ -108,38 +108,38 @@ LinuxStat::CPU.model
|
|
108
108
|
=> "Intel(R) Core(TM) i3-6006U CPU @ 2.00GHz"
|
109
109
|
|
110
110
|
LinuxStat::CPU.stat
|
111
|
-
=> {0=>
|
111
|
+
=> {0=>14.29, 1=>25.0, 2=>0.0, 3=>25.0, 4=>14.29}
|
112
112
|
|
113
113
|
LinuxStat::CPU.total_usage
|
114
|
-
=>
|
114
|
+
=> 18.75
|
115
115
|
|
116
116
|
LinuxStat::CPU.usage
|
117
|
-
=>
|
117
|
+
=> 14.29
|
118
118
|
|
119
119
|
LinuxStat::CPU.usages
|
120
|
-
=> {0=>
|
120
|
+
=> {0=>16.67, 1=>14.29, 2=>28.57, 3=>0.0, 4=>25.0}
|
121
121
|
|
122
122
|
```
|
123
123
|
|
124
124
|
### LinuxStat::Filesystem
|
125
125
|
```
|
126
126
|
LinuxStat::Filesystem.available
|
127
|
-
=>
|
127
|
+
=> 42144575488
|
128
128
|
|
129
129
|
LinuxStat::Filesystem.free
|
130
|
-
=>
|
130
|
+
=> 42144575488
|
131
131
|
|
132
132
|
LinuxStat::Filesystem.stat
|
133
|
-
=> {:total=>119981191168, :free=>
|
133
|
+
=> {:total=>119981191168, :free=>42144575488, :used=>77836615680}
|
134
134
|
|
135
135
|
LinuxStat::Filesystem.stat_raw
|
136
|
-
=> {:block_size=>4096, :fragment_size=>4096, :blocks=>29292283, :block_free=>
|
136
|
+
=> {:block_size=>4096, :fragment_size=>4096, :blocks=>29292283, :block_free=>10289203, :block_avail_unpriv=>10289203, :inodes=>58612160, :free_inodes=>56716465, :filesystem_id=>2050, :mount_flags=>1024, :max_filename_length=>255}
|
137
137
|
|
138
138
|
LinuxStat::Filesystem.total
|
139
139
|
=> 119981191168
|
140
140
|
|
141
141
|
LinuxStat::Filesystem.used
|
142
|
-
=>
|
142
|
+
=> 77836615680
|
143
143
|
|
144
144
|
```
|
145
145
|
|
@@ -154,15 +154,24 @@ LinuxStat::Kernel.build_date_string
|
|
154
154
|
LinuxStat::Kernel.build_user
|
155
155
|
=> "souravgoswami@archlinux"
|
156
156
|
|
157
|
+
LinuxStat::Kernel.clk_tck
|
158
|
+
=> 100
|
159
|
+
|
157
160
|
LinuxStat::Kernel.compiler
|
158
161
|
=> [:gcc, "10.2.0"]
|
159
162
|
|
160
163
|
LinuxStat::Kernel.compiler_version
|
161
164
|
=> "10.2.0"
|
162
165
|
|
166
|
+
LinuxStat::Kernel.release
|
167
|
+
=> "5.9.1-xanmod1-1"
|
168
|
+
|
163
169
|
LinuxStat::Kernel.string
|
164
170
|
=> "Linux version 5.9.1-xanmod1-1 (souravgoswami@archlinux) (gcc (GCC) 10.2.0, GNU ld (GNU Binutils) 2.35.1) #1 SMP PREEMPT Wed, 21 Oct 2020 01:11:20 +0000"
|
165
171
|
|
172
|
+
LinuxStat::Kernel.ticks
|
173
|
+
=> 100
|
174
|
+
|
166
175
|
LinuxStat::Kernel.version
|
167
176
|
=> "5.9.1-xanmod1-1"
|
168
177
|
|
@@ -171,29 +180,29 @@ LinuxStat::Kernel.version
|
|
171
180
|
### LinuxStat::Memory
|
172
181
|
```
|
173
182
|
LinuxStat::Memory.available
|
174
|
-
=>
|
183
|
+
=> 606548
|
175
184
|
|
176
185
|
LinuxStat::Memory.percent_available
|
177
|
-
=>
|
186
|
+
=> 15.81
|
178
187
|
|
179
188
|
LinuxStat::Memory.percent_used
|
180
|
-
=>
|
189
|
+
=> 84.19
|
181
190
|
|
182
191
|
LinuxStat::Memory.stat
|
183
|
-
=> {:total=>
|
192
|
+
=> {:total=>3836256, :used=>3229708, :available=>606548, :percent_used=>84.19, :percent_available=>15.81}
|
184
193
|
|
185
194
|
LinuxStat::Memory.total
|
186
|
-
=>
|
195
|
+
=> 3836256
|
187
196
|
|
188
197
|
LinuxStat::Memory.used
|
189
|
-
=>
|
198
|
+
=> 3229708
|
190
199
|
|
191
200
|
```
|
192
201
|
|
193
202
|
### LinuxStat::Mounts
|
194
203
|
```
|
195
204
|
LinuxStat::Mounts.list
|
196
|
-
=> ["proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0", "sys /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0", "dev /dev devtmpfs rw,nosuid,relatime,size=
|
205
|
+
=> ["proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0", "sys /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0", "dev /dev devtmpfs rw,nosuid,relatime,size=1891804k,nr_inodes=472951,mode=755 0 0", "run /run tmpfs rw,nosuid,nodev,relatime,mode=755 0 0", "...
|
197
206
|
|
198
207
|
LinuxStat::Mounts.root
|
199
208
|
=> "/dev/sda2"
|
@@ -205,14 +214,14 @@ LinuxStat::Mounts.root_mount_options
|
|
205
214
|
=> "rw,noatime,attr2,inode64,logbufs=8,logbsize=32k,noquota"
|
206
215
|
|
207
216
|
LinuxStat::Mounts.tmpfs
|
208
|
-
=> {"/dev/shm"=>"tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0", "/sys/fs/cgroup"=>"tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,size=4096k,nr_inodes=1024,mode=755 0 0", "/
|
217
|
+
=> {"/dev/shm"=>"tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0", "/sys/fs/cgroup"=>"tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,size=4096k,nr_inodes=1024,mode=755 0 0", "/cache"=>"tmpfs /cache tmpfs rw,nosuid,nodev,relatime,size=2097152k 0 0", "/ramdisk...
|
209
218
|
|
210
219
|
```
|
211
220
|
|
212
221
|
### LinuxStat::Net
|
213
222
|
```
|
214
223
|
LinuxStat::Net.ipv4_private
|
215
|
-
=> "192.168.0.
|
224
|
+
=> "192.168.0.101"
|
216
225
|
|
217
226
|
```
|
218
227
|
|
@@ -230,33 +239,39 @@ LinuxStat::OS.hostname
|
|
230
239
|
LinuxStat::OS.lsb_release
|
231
240
|
=> {:LSB_VERSION=>"1.4", :DISTRIB_ID=>"Arch", :DISTRIB_RELEASE=>"rolling", :DISTRIB_DESCRIPTION=>"Arch Linux"}
|
232
241
|
|
242
|
+
LinuxStat::OS.machine
|
243
|
+
=> "x86_64"
|
244
|
+
|
245
|
+
LinuxStat::OS.nodename
|
246
|
+
=> "archlinux"
|
247
|
+
|
233
248
|
LinuxStat::OS.os_release
|
234
249
|
=> {:NAME=>"Arch Linux", :PRETTY_NAME=>"Arch Linux", :ID=>"arch", :BUILD_ID=>"rolling", :ANSI_COLOR=>"38;2;23;147;209", :HOME_URL=>"https://www.archlinux.org/", :DOCUMENTATION_URL=>"https://wiki.archlinux.org/", :SUPPORT_URL=>"https://bbs.archlinux.org/"...
|
235
250
|
|
236
251
|
LinuxStat::OS.uptime
|
237
|
-
=> {:hour=>
|
252
|
+
=> {:hour=>9, :minute=>10, :second=>19.41}
|
238
253
|
|
239
254
|
```
|
240
255
|
|
241
256
|
### LinuxStat::Process
|
242
257
|
```
|
243
258
|
LinuxStat::Process.count
|
244
|
-
=>
|
259
|
+
=> 221
|
245
260
|
|
246
261
|
LinuxStat::Process.idle
|
247
|
-
=> [3, 4, 6, 9, 12, 23, 30, 37, 39, 49, 102, 103, 104, 106, 107, 108, 109, 110, 117, 118,
|
262
|
+
=> [3, 4, 6, 9, 12, 23, 30, 37, 39, 49, 102, 103, 104, 106, 107, 108, 109, 110, 117, 118, 120, 122, 131, 134, 140, 152, 153, 168, 170, 173, 174, 182, 183, 184, 185, 186, 187, 214, 224, 268, 308, 313, 314, 330, 2357, 2358, 2359, 2360, 2361, 2362, 25094, 2...
|
248
263
|
|
249
264
|
LinuxStat::Process.list
|
250
|
-
=> [1, 2, 3, 4, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 46, 47, 48, 49, 50, 51, 52, 102, 103, 104, 106, 107, 108, 109, 110, 112, 114, 115, 117, 118,
|
265
|
+
=> [1, 2, 3, 4, 6, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 46, 47, 48, 49, 50, 51, 52, 102, 103, 104, 106, 107, 108, 109, 110, 112, 114, 115, 117, 118, 120, 122, 131, 134,...
|
251
266
|
|
252
267
|
LinuxStat::Process.names
|
253
|
-
=> {1=>"systemd", 2=>"kthreadd", 3=>"rcu_gp", 4=>"rcu_par_gp", 6=>"kworker/0:0H-
|
268
|
+
=> {1=>"systemd", 2=>"kthreadd", 3=>"rcu_gp", 4=>"rcu_par_gp", 6=>"kworker/0:0H-kblockd", 9=>"mm_percpu_wq", 10=>"ksoftirqd/0", 11=>"rcuc/0", 12=>"rcu_preempt", 13=>"rcub/0", 14=>"migration/0", 15=>"idle_inject/0", 16=>"cpuhp/0", 17=>"cpuhp/1", 18=>"idle...
|
254
269
|
|
255
270
|
LinuxStat::Process.running
|
256
|
-
=> [
|
271
|
+
=> [30804]
|
257
272
|
|
258
273
|
LinuxStat::Process.sleeping
|
259
|
-
=> [1, 2, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 31, 32, 33, 34, 35, 38, 40, 41, 42, 46, 47, 48, 50, 51, 52, 112, 114, 115,
|
274
|
+
=> [1, 2, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 31, 32, 33, 34, 35, 38, 40, 41, 42, 46, 47, 48, 50, 51, 52, 112, 114, 115, 167, 169, 188, 215, 228, 307, 309, 311, 316, 317, 319, 320, 354, 355, 356, 357, 364, 368, 370, 384, 397,...
|
260
275
|
|
261
276
|
LinuxStat::Process.types
|
262
277
|
=> {1=>:sleeping, 2=>:sleeping, 3=>:idle, 4=>:idle, 6=>:idle, 9=>:idle, 10=>:sleeping, 11=>:sleeping, 12=>:idle, 13=>:sleeping, 14=>:sleeping, 15=>:sleeping, 16=>:sleeping, 17=>:sleeping, 18=>:sleeping, 19=>:sleeping, 20=>:sleeping, 21=>:sleeping, 23=>:i...
|
@@ -266,31 +281,118 @@ LinuxStat::Process.zombie
|
|
266
281
|
|
267
282
|
```
|
268
283
|
|
284
|
+
### LinuxStat::ProcessInfo
|
285
|
+
```
|
286
|
+
LinuxStat::ProcessInfo.cmdline
|
287
|
+
=> "ruby bin/linuxstat.rb -md"
|
288
|
+
|
289
|
+
LinuxStat::ProcessInfo.command_name
|
290
|
+
=> "ruby"
|
291
|
+
|
292
|
+
LinuxStat::ProcessInfo.cpu_stat
|
293
|
+
=> {:cpu_usage=>0.0, :threads=>1, :last_executed_cpu=>2}
|
294
|
+
|
295
|
+
LinuxStat::ProcessInfo.cpu_usage
|
296
|
+
=> 0.0
|
297
|
+
|
298
|
+
LinuxStat::ProcessInfo.last_executed_cpu
|
299
|
+
=> 2
|
300
|
+
|
301
|
+
LinuxStat::ProcessInfo.mem_stat
|
302
|
+
=> {:memory=>9644, :virtual_memory=>79568, :resident_memory=>15764}
|
303
|
+
|
304
|
+
LinuxStat::ProcessInfo.memory
|
305
|
+
=> 9644
|
306
|
+
|
307
|
+
LinuxStat::ProcessInfo.resident_memory
|
308
|
+
=> 15764
|
309
|
+
|
310
|
+
LinuxStat::ProcessInfo.threads
|
311
|
+
=> 1
|
312
|
+
|
313
|
+
LinuxStat::ProcessInfo.total_io
|
314
|
+
=> {:read_bytes=>0, :write_bytes=>0}
|
315
|
+
|
316
|
+
LinuxStat::ProcessInfo.virtual_memory
|
317
|
+
=> 79568
|
318
|
+
|
319
|
+
```
|
320
|
+
|
269
321
|
### LinuxStat::Swap
|
270
322
|
```
|
271
323
|
LinuxStat::Swap.any?
|
272
324
|
=> true
|
273
325
|
|
274
326
|
LinuxStat::Swap.available
|
275
|
-
=>
|
327
|
+
=> 2256212
|
276
328
|
|
277
329
|
LinuxStat::Swap.list
|
278
|
-
=> {"/dev/zram0"=>[:partition, 4194300,
|
330
|
+
=> {"/dev/zram0"=>[:partition, 4194300, 1938088, -2]}
|
279
331
|
|
280
332
|
LinuxStat::Swap.percent_available
|
281
|
-
=>
|
333
|
+
=> 53.79
|
282
334
|
|
283
335
|
LinuxStat::Swap.percent_used
|
284
|
-
=>
|
336
|
+
=> 46.21
|
285
337
|
|
286
338
|
LinuxStat::Swap.stat
|
287
|
-
=> {:total=>4194300, :used=>
|
339
|
+
=> {:total=>4194300, :used=>1938088, :available=>2256212, :percent_used=>46.21, :percent_available=>53.79}
|
288
340
|
|
289
341
|
LinuxStat::Swap.total
|
290
342
|
=> 4194300
|
291
343
|
|
292
344
|
LinuxStat::Swap.used
|
293
|
-
=>
|
345
|
+
=> 1938088
|
346
|
+
|
347
|
+
```
|
348
|
+
|
349
|
+
### LinuxStat::Sysconf
|
350
|
+
```
|
351
|
+
LinuxStat::Sysconf.child_max
|
352
|
+
=> 2000000
|
353
|
+
|
354
|
+
LinuxStat::Sysconf.hostname_max
|
355
|
+
=> 64
|
356
|
+
|
357
|
+
LinuxStat::Sysconf.login_name_max
|
358
|
+
=> 256
|
359
|
+
|
360
|
+
LinuxStat::Sysconf.open_max
|
361
|
+
=> 8192
|
362
|
+
|
363
|
+
LinuxStat::Sysconf.page_size_max
|
364
|
+
=> 4096
|
365
|
+
|
366
|
+
LinuxStat::Sysconf.posix_version
|
367
|
+
=> 200809
|
368
|
+
|
369
|
+
LinuxStat::Sysconf.sc_clk_tck
|
370
|
+
=> 100
|
371
|
+
|
372
|
+
LinuxStat::Sysconf.stream_max
|
373
|
+
=> 16
|
374
|
+
|
375
|
+
LinuxStat::Sysconf.tty_name_max
|
376
|
+
=> 32
|
377
|
+
|
378
|
+
```
|
379
|
+
|
380
|
+
### LinuxStat::Uname
|
381
|
+
```
|
382
|
+
LinuxStat::Uname.machine
|
383
|
+
=> "x86_64"
|
384
|
+
|
385
|
+
LinuxStat::Uname.nodename
|
386
|
+
=> "archlinux"
|
387
|
+
|
388
|
+
LinuxStat::Uname.release
|
389
|
+
=> "5.9.1-xanmod1-1"
|
390
|
+
|
391
|
+
LinuxStat::Uname.sysname
|
392
|
+
=> "Linux"
|
393
|
+
|
394
|
+
LinuxStat::Uname.version
|
395
|
+
=> "#1 SMP PREEMPT Wed, 21 Oct 2020 01:11:20 +0000"
|
294
396
|
|
295
397
|
```
|
296
398
|
|
data/bin/linuxstat.rb
CHANGED
data/ext/fs_stat/fs_stat.c
CHANGED
@@ -25,6 +25,7 @@ static VALUE statfs(VALUE obj, VALUE dir) {
|
|
25
25
|
}
|
26
26
|
|
27
27
|
void Init_fs_stat() {
|
28
|
-
VALUE
|
28
|
+
VALUE _linux_stat = rb_define_module("LinuxStat") ;
|
29
|
+
VALUE fs = rb_define_module_under(_linux_stat, "FS") ;
|
29
30
|
rb_define_module_function(fs, "stat", statfs, 1) ;
|
30
31
|
}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#include <unistd.h>
|
2
|
+
#include "ruby.h"
|
3
|
+
|
4
|
+
static VALUE getTick(VALUE obj) {
|
5
|
+
return INT2FIX(sysconf(_SC_CLK_TCK)) ;
|
6
|
+
}
|
7
|
+
|
8
|
+
static VALUE getChildMax(VALUE obj) {
|
9
|
+
return INT2FIX(sysconf(_SC_CHILD_MAX)) ;
|
10
|
+
}
|
11
|
+
|
12
|
+
static VALUE getHostnameMax(VALUE obj) {
|
13
|
+
return INT2FIX(sysconf(_SC_HOST_NAME_MAX)) ;
|
14
|
+
}
|
15
|
+
|
16
|
+
static VALUE getLoginNameMax(VALUE obj) {
|
17
|
+
return INT2FIX(sysconf(_SC_LOGIN_NAME_MAX)) ;
|
18
|
+
}
|
19
|
+
|
20
|
+
static VALUE getOpenMax(VALUE obj) {
|
21
|
+
return INT2FIX(sysconf(_SC_OPEN_MAX)) ;
|
22
|
+
}
|
23
|
+
|
24
|
+
static VALUE getPageSizeMax(VALUE obj) {
|
25
|
+
return INT2FIX(sysconf(_SC_PAGESIZE)) ;
|
26
|
+
}
|
27
|
+
|
28
|
+
static VALUE getStreamMax(VALUE obj) {
|
29
|
+
return INT2FIX(sysconf(_SC_STREAM_MAX)) ;
|
30
|
+
}
|
31
|
+
|
32
|
+
static VALUE getTTYNameMax(VALUE obj) {
|
33
|
+
return INT2FIX(sysconf(_SC_TTY_NAME_MAX)) ;
|
34
|
+
}
|
35
|
+
|
36
|
+
static VALUE getPosixVersion(VALUE obj) {
|
37
|
+
return INT2FIX(sysconf(_SC_VERSION)) ;
|
38
|
+
}
|
39
|
+
|
40
|
+
void Init_sysconf() {
|
41
|
+
VALUE _linux_stat = rb_define_module("LinuxStat") ;
|
42
|
+
VALUE _sysconf = rb_define_module_under(_linux_stat, "Sysconf") ;
|
43
|
+
|
44
|
+
rb_define_module_function(_sysconf, "sc_clk_tck", getTick, 0) ;
|
45
|
+
rb_define_module_function(_sysconf, "child_max", getChildMax, 0) ;
|
46
|
+
rb_define_module_function(_sysconf, "hostname_max", getHostnameMax, 0) ;
|
47
|
+
rb_define_module_function(_sysconf, "login_name_max", getLoginNameMax, 0) ;
|
48
|
+
rb_define_module_function(_sysconf, "open_max", getOpenMax, 0) ;
|
49
|
+
rb_define_module_function(_sysconf, "page_size_max", getPageSizeMax, 0) ;
|
50
|
+
rb_define_module_function(_sysconf, "stream_max", getStreamMax, 0) ;
|
51
|
+
rb_define_module_function(_sysconf, "tty_name_max", getTTYNameMax, 0) ;
|
52
|
+
rb_define_module_function(_sysconf, "posix_version", getPosixVersion, 0) ;
|
53
|
+
}
|
data/ext/utsname/utsname.c
CHANGED
@@ -10,9 +10,9 @@ void init_buf() {
|
|
10
10
|
status = uname(&buf) ;
|
11
11
|
}
|
12
12
|
|
13
|
-
static VALUE
|
14
|
-
VALUE
|
15
|
-
return
|
13
|
+
static VALUE getSysname(VALUE obj) {
|
14
|
+
VALUE sysname = status < 0 ? rb_str_new_cstr("") : rb_str_new_cstr(buf.sysname) ;
|
15
|
+
return sysname ;
|
16
16
|
}
|
17
17
|
|
18
18
|
static VALUE getNodename(VALUE obj) {
|
@@ -20,10 +20,30 @@ static VALUE getNodename(VALUE obj) {
|
|
20
20
|
return nodename ;
|
21
21
|
}
|
22
22
|
|
23
|
+
static VALUE getRelease(VALUE obj) {
|
24
|
+
VALUE release = status < 0 ? rb_str_new_cstr("") : rb_str_new_cstr(buf.release) ;
|
25
|
+
return release ;
|
26
|
+
}
|
27
|
+
|
28
|
+
static VALUE getVersion(VALUE obj) {
|
29
|
+
VALUE version = status < 0 ? rb_str_new_cstr("") : rb_str_new_cstr(buf.version) ;
|
30
|
+
return version ;
|
31
|
+
}
|
32
|
+
|
33
|
+
static VALUE getMachine(VALUE obj) {
|
34
|
+
VALUE machine = status < 0 ? rb_str_new_cstr("") : rb_str_new_cstr(buf.machine) ;
|
35
|
+
return machine ;
|
36
|
+
}
|
37
|
+
|
23
38
|
void Init_utsname() {
|
24
39
|
init_buf() ;
|
25
40
|
|
26
|
-
VALUE
|
27
|
-
|
41
|
+
VALUE _linux_stat = rb_define_module("LinuxStat") ;
|
42
|
+
VALUE _uname = rb_define_module_under(_linux_stat, "Uname") ;
|
43
|
+
|
44
|
+
rb_define_module_function(_uname, "sysname", getSysname, 0) ;
|
28
45
|
rb_define_module_function(_uname, "nodename", getNodename, 0) ;
|
46
|
+
rb_define_module_function(_uname, "release", getRelease, 0) ;
|
47
|
+
rb_define_module_function(_uname, "version", getVersion, 0) ;
|
48
|
+
rb_define_module_function(_uname, "machine", getMachine, 0) ;
|
29
49
|
}
|
data/lib/linux_stat.rb
CHANGED
@@ -2,7 +2,6 @@ require "linux_stat/version"
|
|
2
2
|
require "linux_stat/battery"
|
3
3
|
require "linux_stat/bios"
|
4
4
|
require "linux_stat/cpu"
|
5
|
-
require "linux_stat/kernel"
|
6
5
|
require "linux_stat/memory"
|
7
6
|
require "linux_stat/net"
|
8
7
|
|
@@ -15,3 +14,7 @@ require "linux_stat/mounts"
|
|
15
14
|
|
16
15
|
require "linux_stat/fs_stat"
|
17
16
|
require "linux_stat/filesystem"
|
17
|
+
|
18
|
+
require "linux_stat/sysconf"
|
19
|
+
require "linux_stat/kernel"
|
20
|
+
require "linux_stat/process_info"
|
data/lib/linux_stat/battery.rb
CHANGED
@@ -9,7 +9,7 @@ module LinuxStat
|
|
9
9
|
end
|
10
10
|
|
11
11
|
# Returns the details of the battery.
|
12
|
-
#If the battery is not present it will return an empty Hash.
|
12
|
+
# If the battery is not present it will return an empty Hash.
|
13
13
|
def stat
|
14
14
|
st = status.downcase
|
15
15
|
return {} unless present?
|
@@ -27,7 +27,7 @@ module LinuxStat
|
|
27
27
|
end
|
28
28
|
|
29
29
|
# Returns the model of the battery.
|
30
|
-
#If the battery is not present or the information isn't available it will return an empty String.
|
30
|
+
# If the battery is not present or the information isn't available it will return an empty String.
|
31
31
|
def model
|
32
32
|
return ''.freeze unless model_readable?
|
33
33
|
IO.read(File.join(PATH, 'model_name')).tap(&:strip!)
|
data/lib/linux_stat/bios.rb
CHANGED
@@ -3,9 +3,10 @@ module LinuxStat
|
|
3
3
|
class << self
|
4
4
|
# Returns the model of the BIOS.
|
5
5
|
# If the information is not available it will return a frozen empty string.
|
6
|
-
#
|
6
|
+
#
|
7
|
+
# The output is also cached (memoized) ; as changing the value in runtime is unexpected.
|
7
8
|
def model
|
8
|
-
#
|
9
|
+
# cached (memoized) ; as changing the value in runtime is unexpected
|
9
10
|
@@model ||= if File.readable?('/sys/devices/virtual/dmi/id/product_name')
|
10
11
|
IO.read('/sys/devices/virtual/dmi/id/product_name').tap(&:strip!)
|
11
12
|
elsif File.readable?('/sys/firmware/devicetree/base/model')
|
@@ -17,9 +18,10 @@ module LinuxStat
|
|
17
18
|
|
18
19
|
# Returns the vendor of the BIOS.
|
19
20
|
# If the information is not available it will return a frozen empty string.
|
20
|
-
#
|
21
|
+
#
|
22
|
+
# The output is also cached (memoized) ; as changing the value in runtime is unexpected.
|
21
23
|
def vendor
|
22
|
-
#
|
24
|
+
# cached (memoized) ; as changing the value in runtime is unexpected
|
23
25
|
@@vendor ||= if File.readable?('/sys/devices/virtual/dmi/id/bios_vendor')
|
24
26
|
IO.read('/sys/devices/virtual/dmi/id/bios_vendor').tap(&:strip!)
|
25
27
|
else
|
@@ -29,7 +31,8 @@ module LinuxStat
|
|
29
31
|
|
30
32
|
# Returns the version of the BIOS.
|
31
33
|
# If the information is not available it will return a frozen empty string.
|
32
|
-
#
|
34
|
+
#
|
35
|
+
# The output is also cached (memoized) ; as changing the value in runtime is unexpected.
|
33
36
|
def version
|
34
37
|
@@version ||= if File.readable?('/sys/devices/virtual/dmi/id/bios_version')
|
35
38
|
IO.read('/sys/devices/virtual/dmi/id/bios_version').tap(&:strip!)
|
@@ -40,7 +43,8 @@ module LinuxStat
|
|
40
43
|
|
41
44
|
# Returns the date of the BIOS.
|
42
45
|
# If the information is not available it will return a frozen empty string.
|
43
|
-
#
|
46
|
+
#
|
47
|
+
# The output is also cached (memoized) ; as changing the value in runtime is unexpected.
|
44
48
|
def date
|
45
49
|
@@date ||= if File.readable?('/sys/devices/virtual/dmi/id/bios_date')
|
46
50
|
IO.read('/sys/devices/virtual/dmi/id/bios_date').tap(&:strip!)
|
data/lib/linux_stat/cpu.rb
CHANGED
@@ -19,7 +19,14 @@ module LinuxStat
|
|
19
19
|
sleep(sleep)
|
20
20
|
data2 = IO.readlines('/proc/stat').select! { |x| x[/^cpu\d*/] }.map! { |x| x.split.map!(&:to_f) }
|
21
21
|
|
22
|
-
|
22
|
+
# On devices like android, the core count can change anytime.
|
23
|
+
# I had crashes on Termux.
|
24
|
+
# So better just count the min number of CPU and iterate over that
|
25
|
+
# If data.length is smaller than data2.length, we don't have enough data to compare.
|
26
|
+
dl, d2l = data.length, data2.length
|
27
|
+
min = dl > d2l ? d2l : dl
|
28
|
+
|
29
|
+
min.times.reduce({}) do |h, x|
|
23
30
|
user, nice, sys, idle, iowait, irq, softirq, steal = *data[x].drop(1)
|
24
31
|
user2, nice2, sys2, idle2, iowait2, irq2, softirq2, steal2 = *data2[x].drop(1)
|
25
32
|
|
@@ -63,7 +70,8 @@ module LinuxStat
|
|
63
70
|
|
64
71
|
# Returns the model of processor.
|
65
72
|
# If the information isn't available, it will return en empty string.
|
66
|
-
#
|
73
|
+
#
|
74
|
+
# The output is also cached (memoized) ; as changing the value in runtime is unexpected.
|
67
75
|
def model
|
68
76
|
@@name ||= cpuinfo.find { |x| x.start_with?('model name') }.to_s.split(?:)[-1].to_s.strip
|
69
77
|
end
|
@@ -1,7 +1,5 @@
|
|
1
1
|
module LinuxStat
|
2
2
|
module Filesystem
|
3
|
-
prepend FS
|
4
|
-
|
5
3
|
class << self
|
6
4
|
# stat(fs = '/')
|
7
5
|
# Where fs is the directory of the file system (like / or /tmp/ or /run/media/thumbdrive).
|
@@ -12,7 +10,7 @@ module LinuxStat
|
|
12
10
|
# 3. used space (in kilobytes)
|
13
11
|
#
|
14
12
|
# In a hash format:
|
15
|
-
#
|
13
|
+
# {:total=>119981191168, :free=>43155574784, :used=>76825616384, :available=>43155574784}
|
16
14
|
#
|
17
15
|
# If the stat can't be acquired, this method will return an empty Hash.
|
18
16
|
def stat(fs = ?/.freeze)
|
@@ -23,7 +21,7 @@ module LinuxStat
|
|
23
21
|
{
|
24
22
|
total: s[:block_size] * s[:blocks],
|
25
23
|
free: s[:block_size] * s[:block_free],
|
26
|
-
used: s[:blocks].-(s[:block_free]) * s[:block_size]
|
24
|
+
used: s[:blocks].-(s[:block_free]) * s[:block_size]
|
27
25
|
}
|
28
26
|
end
|
29
27
|
|
@@ -83,11 +81,11 @@ module LinuxStat
|
|
83
81
|
# Where fs is the directory of the file system (like / or /tmp/ or /run/media/thumbdrive).
|
84
82
|
#
|
85
83
|
# It returns a Hash with the following data (for example):
|
86
|
-
#
|
84
|
+
# {:block_size=>4096, :fragment_size=>4096, :blocks=>29292283, :block_free=>10535967, :block_avail_unpriv=>10535967, :inodes=>58612160, :free_inodes=>56718550, :filesystem_id=>2050, :mount_flags=>1024, :max_filename_length=>255}
|
87
85
|
#
|
88
86
|
# If the stat can't be acquired, this method will return an empty Hash.
|
89
|
-
def stat_raw(fs =
|
90
|
-
FS.stat(fs)
|
87
|
+
def stat_raw(fs = ?/.freeze)
|
88
|
+
LinuxStat::FS.stat(fs)
|
91
89
|
end
|
92
90
|
end
|
93
91
|
end
|
data/lib/linux_stat/kernel.rb
CHANGED
@@ -3,7 +3,7 @@ module LinuxStat
|
|
3
3
|
class << self
|
4
4
|
# Returns the Linux Kernel version.
|
5
5
|
# If the information isn't available, it will return a frozen empty string.
|
6
|
-
# The output is also cached ; as changing the value in runtime is unexpected.
|
6
|
+
# The output is also cached (memoized) ; as changing the value in runtime is unexpected.
|
7
7
|
def version
|
8
8
|
return ''.freeze if string.empty?
|
9
9
|
@@version ||= splitted[2]
|
@@ -11,7 +11,7 @@ module LinuxStat
|
|
11
11
|
|
12
12
|
# Returns the name of the user who built the kernel using KBUILD_FLAGS.
|
13
13
|
# If the information isn't available, it will return a frozen empty string.
|
14
|
-
# The output is also cached ; as changing the value in runtime is unexpected.
|
14
|
+
# The output is also cached (memoized) ; as changing the value in runtime is unexpected.
|
15
15
|
def build_user
|
16
16
|
@@build_user ||= string.split(/(\(.+\))/).each(&:strip!)
|
17
17
|
.reject(&:empty?).find { |x| x[/^\(.+\)$/] }.to_s
|
@@ -20,7 +20,7 @@ module LinuxStat
|
|
20
20
|
|
21
21
|
# Returns the compiler used to compile the Linux Kernel.
|
22
22
|
# If the information isn't available, it will return a frozen empty string.
|
23
|
-
# The output is also cached ; as changing the value in runtime is unexpected.
|
23
|
+
# The output is also cached (memoized) ; as changing the value in runtime is unexpected.
|
24
24
|
def compiler
|
25
25
|
return ''.freeze if string.empty?
|
26
26
|
|
@@ -39,7 +39,7 @@ module LinuxStat
|
|
39
39
|
|
40
40
|
# Returns the compiler version used to compile the Linux Kernel.
|
41
41
|
# If the information isn't available, it will return a frozen empty string.
|
42
|
-
# The output is also cached ; as changing the value in runtime is unexpected.
|
42
|
+
# The output is also cached (memoized) ; as changing the value in runtime is unexpected.
|
43
43
|
def compiler_version
|
44
44
|
@@compiler_version ||= string.split(/(\(.+?\))/).each(&:strip!)
|
45
45
|
.reject(&:empty?)[2..4].to_a
|
@@ -62,7 +62,7 @@ module LinuxStat
|
|
62
62
|
# You have to use regexp yourself to get the proper zone.
|
63
63
|
# Use LinuxStat::Kernel.build_date_string to get the original string if you need that.
|
64
64
|
#
|
65
|
-
# The output is also cached ; as changing the value in runtime is unexpected.
|
65
|
+
# The output is also cached (memoized) ; as changing the value in runtime is unexpected.
|
66
66
|
def build_date
|
67
67
|
return nil if splitted.empty?
|
68
68
|
|
@@ -107,7 +107,7 @@ module LinuxStat
|
|
107
107
|
# You have to use regexp yourself to get the proper zone.
|
108
108
|
# Use LinuxStat::Kernel.build_date_string to get the original string if you need that.
|
109
109
|
#
|
110
|
-
# The output is also cached ; as changing the value in runtime is unexpected.
|
110
|
+
# The output is also cached (memoized) ; as changing the value in runtime is unexpected.
|
111
111
|
def build_date_string
|
112
112
|
return nil if splitted.empty?
|
113
113
|
|
@@ -141,6 +141,15 @@ module LinuxStat
|
|
141
141
|
@@string ||= File.readable?('/proc/version') ? IO.read('/proc/version', 1024).tap(&:strip!) : ''
|
142
142
|
end
|
143
143
|
|
144
|
+
# Returns the sc_clk_tck or the same output from command `getconf CLK_TCK`.
|
145
|
+
# Also, clk_tck is an alias of this method.
|
146
|
+
# The output is also cached ; as changing the value in runtime is unexpected.
|
147
|
+
def ticks
|
148
|
+
@@tick ||= LinuxStat::Sysconf.sc_clk_tck
|
149
|
+
end
|
150
|
+
|
151
|
+
alias clk_tck ticks
|
152
|
+
|
144
153
|
private
|
145
154
|
def splitted
|
146
155
|
@@string_splitted ||= string.split
|
data/lib/linux_stat/memory.rb
CHANGED
@@ -2,9 +2,10 @@ module LinuxStat
|
|
2
2
|
module Memory
|
3
3
|
class << self
|
4
4
|
# Returns the memory details reported by /proc/meminfo. In this format:
|
5
|
-
#
|
5
|
+
# {:total=>3836264, :used=>3097952, :available=>738312, :percent_used=>80.75, :percent_available=>19.25}
|
6
|
+
#
|
7
|
+
# The values are in Kilobyte.
|
6
8
|
#
|
7
|
-
# The value is in Kilobyte.
|
8
9
|
# If the statistics is not available, it will return an empty Hash.
|
9
10
|
def stat
|
10
11
|
return {} unless meminfo?
|
@@ -31,6 +32,7 @@ module LinuxStat
|
|
31
32
|
|
32
33
|
# Returns the total memory details reported by /proc/meminfo.
|
33
34
|
# The value is in Kilobyte.
|
35
|
+
#
|
34
36
|
# It retuns an Integer but if the info is not available, it will return nil.
|
35
37
|
def total
|
36
38
|
return nil unless meminfo?
|
@@ -39,6 +41,7 @@ module LinuxStat
|
|
39
41
|
|
40
42
|
# Returns the total memory details reported by /proc/meminfo.
|
41
43
|
# The value is in Kilobyte.
|
44
|
+
#
|
42
45
|
# It retuns an Integer but if the info is not available, it will return nil
|
43
46
|
def available
|
44
47
|
return nil unless meminfo?
|
@@ -47,6 +50,7 @@ module LinuxStat
|
|
47
50
|
|
48
51
|
# Returns the amount of memory used reported by /proc/meminfo.
|
49
52
|
# The value is in Kilobyte.
|
53
|
+
#
|
50
54
|
# It retuns an Integer but if the info is not available, it will return nil.
|
51
55
|
def used
|
52
56
|
return nil unless meminfo?
|
@@ -55,6 +59,7 @@ module LinuxStat
|
|
55
59
|
end
|
56
60
|
|
57
61
|
# Returns the percentage of memory used reported by /proc/meminfo.
|
62
|
+
#
|
58
63
|
# It retuns an Integer but if the info is not available, it will return nil
|
59
64
|
def percent_used
|
60
65
|
return nil unless meminfo?
|
@@ -64,6 +69,7 @@ module LinuxStat
|
|
64
69
|
end
|
65
70
|
|
66
71
|
# Returns the percentage of memory used reported by /proc/meminfo.
|
72
|
+
#
|
67
73
|
# It retuns an Integer but if the info is not available, it will return nil
|
68
74
|
def percent_available
|
69
75
|
return nil unless meminfo?
|
data/lib/linux_stat/os.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
module LinuxStat
|
2
2
|
module OS
|
3
|
-
prepend Uname
|
4
|
-
|
5
3
|
class << self
|
6
4
|
# Reads /etc/os-release and returns a Hash. For example:
|
7
|
-
#
|
5
|
+
# {:NAME=>"Arch Linux", :PRETTY_NAME=>"Arch Linux", :ID=>"arch", :BUILD_ID=>"rolling", :ANSI_COLOR=>"38;2;23;147;209", :HOME_URL=>"https://www.archlinux.org/", :DOCUMENTATION_URL=>"https://wiki.archlinux.org/", :SUPPORT_URL=>"https://bbs.archlinux.org/", :BUG_REPORT_URL=>"https://bugs.archlinux.org/", :LOGO=>"archlinux"}
|
8
6
|
#
|
9
7
|
# If the info isn't available, it will return an empty Hash.
|
10
8
|
#
|
@@ -13,12 +11,12 @@ module LinuxStat
|
|
13
11
|
# The information is also cached, and once loaded, won't change in runtime. Because changing the /etc/lsb-release
|
14
12
|
# isn't expected in runtime.
|
15
13
|
def os_release
|
16
|
-
#
|
14
|
+
# cached (memoized) ; as changing the value in runtime is unexpected
|
17
15
|
@@os_release ||= File.readable?('/etc/os-release') ? release('/etc/os-release') : {}
|
18
16
|
end
|
19
17
|
|
20
18
|
# Reads /etc/lsb-release and returns a Hash. For example:
|
21
|
-
#
|
19
|
+
# {:LSB_VERSION=>"1.4", :DISTRIB_ID=>"Arch", :DISTRIB_RELEASE=>"rolling", :DISTRIB_DESCRIPTION=>"Arch Linux"}
|
22
20
|
#
|
23
21
|
# If the info isn't available, it will return an empty Hash.
|
24
22
|
#
|
@@ -27,12 +25,13 @@ module LinuxStat
|
|
27
25
|
# The information is also cached, and once loaded, won't change in runtime. Because changing the /etc/lsb-release
|
28
26
|
# isn't expected in runtime.
|
29
27
|
def lsb_release
|
30
|
-
#
|
28
|
+
# cached (memoized) ; as changing the value in runtime is unexpected
|
31
29
|
@@lsb_release ||= File.readable?('/etc/lsb-release') ? release('/etc/lsb-release') : {}
|
32
30
|
end
|
33
31
|
|
34
32
|
# Reads /etc/lsb-release or /etc/os-release tries to get information about the distribution.
|
35
33
|
# If the information isn't available, it will read and return /etc/issue.
|
34
|
+
#
|
36
35
|
# The return type is String.
|
37
36
|
# If none of the info is available, it will return an empty frozen String.
|
38
37
|
def distribution
|
@@ -54,18 +53,21 @@ module LinuxStat
|
|
54
53
|
end
|
55
54
|
|
56
55
|
# Uses utsname.h to determine the machine
|
56
|
+
#
|
57
57
|
# It returns a String but if the info isn't available, it will return an empty String
|
58
58
|
def machine
|
59
|
-
@@machine ||= Uname.machine
|
59
|
+
@@machine ||= LinuxStat::Uname.machine
|
60
60
|
end
|
61
61
|
|
62
62
|
# Uses utsname.h to determine the system nodename
|
63
|
+
#
|
63
64
|
# It returns String but if the info isn't available, it will return an empty String
|
64
65
|
def nodename
|
65
|
-
@@nodename ||= Uname.nodename
|
66
|
+
@@nodename ||= LinuxStat::Uname.nodename
|
66
67
|
end
|
67
68
|
|
68
69
|
# Reads /etc/hostname and returns the hostname.
|
70
|
+
#
|
69
71
|
# The return type is String.
|
70
72
|
# If the info info isn't available, it will return 'localhost'.
|
71
73
|
def hostname
|
@@ -90,7 +92,7 @@ module LinuxStat
|
|
90
92
|
end
|
91
93
|
|
92
94
|
# Reads /proc/uptime and returns the system uptime:
|
93
|
-
#
|
95
|
+
# {:hour=>10, :minute=>34, :second=>12.59}
|
94
96
|
#
|
95
97
|
# If the stat isn't available, an empty hash is returned.
|
96
98
|
def uptime
|
@@ -0,0 +1,310 @@
|
|
1
|
+
module LinuxStat
|
2
|
+
module ProcessInfo
|
3
|
+
class << self
|
4
|
+
# total_io(pid = $$)
|
5
|
+
# Where pid is the process ID.
|
6
|
+
# By default it is the id of the current process ($$)
|
7
|
+
#
|
8
|
+
# It retuns the total read/write caused by a process.
|
9
|
+
# The output is Hash. For example, a sample output:
|
10
|
+
# {:read_bytes=>0, :write_bytes=>0}
|
11
|
+
#
|
12
|
+
# The output is only based on the total disk IO the process has done.
|
13
|
+
#
|
14
|
+
# If the info isn't available it will return an empty Hash.
|
15
|
+
def total_io(pid = $$)
|
16
|
+
return {} unless File.readable?("/proc/#{pid}/io".freeze)
|
17
|
+
out = {}
|
18
|
+
|
19
|
+
IO.readlines("/proc/#{pid}/io".freeze).each { |x|
|
20
|
+
x.strip!
|
21
|
+
|
22
|
+
if x[/^(read|write)_bytes:\s*\d*$/]
|
23
|
+
splitted = x.split
|
24
|
+
out.merge!(splitted[0].split(?:)[0].to_sym => splitted[-1].to_i)
|
25
|
+
end
|
26
|
+
}
|
27
|
+
|
28
|
+
out
|
29
|
+
end
|
30
|
+
|
31
|
+
# cmdline(pid = $$)
|
32
|
+
# Where pid is the process ID.
|
33
|
+
# By default it is the id of the current process ($$)
|
34
|
+
#
|
35
|
+
# It retuns the total command of the process.
|
36
|
+
# The output is String. For example, a sample output:
|
37
|
+
# "ruby -r linux_stat -e p LinuxStat::ProcessInfo.cmdline"
|
38
|
+
#
|
39
|
+
# If the info isn't available it will return an empty frozen String.
|
40
|
+
def cmdline(pid = $$)
|
41
|
+
file = "/proc/#{pid}/cmdline".freeze
|
42
|
+
return ''.freeze unless File.readable?(file)
|
43
|
+
|
44
|
+
_cmdline = IO.read(file)
|
45
|
+
_cmdline.gsub!(?\u0000, ?\s)
|
46
|
+
_cmdline.tap(&:strip!)
|
47
|
+
end
|
48
|
+
|
49
|
+
# command_name(pid = $$)
|
50
|
+
# Where pid is the process ID.
|
51
|
+
# By default it is the id of the current process ($$)
|
52
|
+
#
|
53
|
+
# It retuns the total command name of the process.
|
54
|
+
# The output is String. For example, a sample output:
|
55
|
+
# "ruby"
|
56
|
+
#
|
57
|
+
# If the info isn't available it will return an empty frozen String.
|
58
|
+
def command_name(pid = $$)
|
59
|
+
# Do note that the /proc/ppid/comm may not contain the full name
|
60
|
+
file = "/proc/#{pid}/cmdline".freeze
|
61
|
+
return ''.freeze unless File.readable?(file)
|
62
|
+
|
63
|
+
_cmdline = IO.read(file)
|
64
|
+
_cmdline.gsub!(?\u0000, ?\s)
|
65
|
+
File.split(_cmdline.tap(&:strip!).split[0])[-1]
|
66
|
+
end
|
67
|
+
|
68
|
+
# mem_stat(pid = $$)
|
69
|
+
# Where pid is the process ID.
|
70
|
+
# By default it is the id of the current process ($$)
|
71
|
+
#
|
72
|
+
# It retuns the memory, virtual memory, and resident memory of the process.
|
73
|
+
# All values are in Kilobytes.
|
74
|
+
#
|
75
|
+
# The output is a Hash. For example, a sample output:
|
76
|
+
# {:memory=>8656, :virtual_memory=>78272, :resident_memory=>14072}
|
77
|
+
#
|
78
|
+
# Note:
|
79
|
+
# If you need only memory usage of a process, run LinuxStat::ProcessInfo.memory(pid)
|
80
|
+
# If you need only virtual memory for a process, run LinuxStat::ProcessInfo.virtual_memory(pid)
|
81
|
+
# If you need only resident memory of a process, run LinuxStat::ProcessInfo.resident_memory(pid)
|
82
|
+
#
|
83
|
+
# This method opens opens multiple files.
|
84
|
+
# But if you need all of the info, then running this method once is efficient.
|
85
|
+
#
|
86
|
+
# If the info isn't available it will return an empty Hash.
|
87
|
+
def mem_stat(pid = $$)
|
88
|
+
stat_file = "/proc/#{pid}/stat".freeze
|
89
|
+
status_file = "/proc/#{pid}/status".freeze
|
90
|
+
|
91
|
+
stat = if File.readable?(stat_file)
|
92
|
+
IO.read(stat_file).split
|
93
|
+
else
|
94
|
+
[]
|
95
|
+
end
|
96
|
+
|
97
|
+
status = if File.readable?(status_file)
|
98
|
+
IO.readlines(status_file)
|
99
|
+
else
|
100
|
+
[]
|
101
|
+
end
|
102
|
+
|
103
|
+
_rss_anon = status.find { |x| x.start_with?('RssAnon') }
|
104
|
+
rss_anon = _rss_anon ? _rss_anon.split[1].to_i : nil
|
105
|
+
|
106
|
+
_virtual_memory = stat[22]
|
107
|
+
vm = _virtual_memory ? _virtual_memory.to_i.fdiv(1024).to_i : nil
|
108
|
+
|
109
|
+
_vm_rss = status.find { |x| x.start_with?('VmRSS') }
|
110
|
+
vm_rss = _vm_rss ? _vm_rss.split[1].to_i : nil
|
111
|
+
|
112
|
+
{
|
113
|
+
memory: rss_anon,
|
114
|
+
virtual_memory: vm,
|
115
|
+
resident_memory: vm_rss
|
116
|
+
}
|
117
|
+
end
|
118
|
+
|
119
|
+
# memory(pid = $$)
|
120
|
+
# Where pid is the process ID.
|
121
|
+
# By default it is the id of the current process ($$)
|
122
|
+
#
|
123
|
+
# It retuns the memory of the process.
|
124
|
+
# The value is in Kilobytes.
|
125
|
+
# The output is an Integer. For example, a sample output:
|
126
|
+
# 8664
|
127
|
+
#
|
128
|
+
# If the info isn't available it will return nil.
|
129
|
+
def memory(pid = $$)
|
130
|
+
_rss_anon = IO.readlines("/proc/#{pid}/status")
|
131
|
+
.find { |x| x.start_with?('RssAnon') }
|
132
|
+
|
133
|
+
_rss_anon ? _rss_anon.split[1].to_i : nil
|
134
|
+
end
|
135
|
+
|
136
|
+
# virtual_memory(pid = $$)
|
137
|
+
# Where pid is the process ID.
|
138
|
+
# By default it is the id of the current process ($$)
|
139
|
+
#
|
140
|
+
# It retuns the virtual memory for the process.
|
141
|
+
# The value is in Kilobytes.
|
142
|
+
# The output is an Integer. For example, a sample output:
|
143
|
+
# 78376
|
144
|
+
#
|
145
|
+
# If the info isn't available it will return nil.
|
146
|
+
def virtual_memory(pid = $$)
|
147
|
+
_virtual_memory = IO.read("/proc/#{pid}/stat".freeze).split[22]
|
148
|
+
_virtual_memory ? _virtual_memory.to_i.fdiv(1024).to_i : nil
|
149
|
+
end
|
150
|
+
|
151
|
+
# resident_memory(pid = $$)
|
152
|
+
# Where pid is the process ID.
|
153
|
+
# By default it is the id of the current process ($$)
|
154
|
+
#
|
155
|
+
# It retuns the resident memory for the process.
|
156
|
+
# The value is in Kilobytes.
|
157
|
+
# The output is an Integer. For example, a sample output:
|
158
|
+
# 14012
|
159
|
+
#
|
160
|
+
# If the info isn't available it will return nil.
|
161
|
+
def resident_memory(pid = $$)
|
162
|
+
_vm_rss = IO.readlines("/proc/#{pid}/status")
|
163
|
+
.find { |x| x.start_with?('VmRSS') }
|
164
|
+
|
165
|
+
_vm_rss ? _vm_rss.split[1].to_i : nil
|
166
|
+
end
|
167
|
+
|
168
|
+
# cpu_stat(pid: $$, sleep: 0.05)
|
169
|
+
# Where pid is the process ID and sleep time is the interval between measurements.
|
170
|
+
# By default it is the id of the current process ($$), and sleep is 0.05
|
171
|
+
#
|
172
|
+
# Note 1:
|
173
|
+
# Do note that the sleep time can slow down your application.
|
174
|
+
# And it's only needed for the cpu usage calculation.
|
175
|
+
#
|
176
|
+
# It retuns the CPU usage, threads, and the last executed CPU in Hash.
|
177
|
+
# For example:
|
178
|
+
# {:cpu_usage=>0.0, :threads=>1, :last_executed_cpu=>1}
|
179
|
+
#
|
180
|
+
# But if the info isn't available, it will return an empty Hash.
|
181
|
+
#
|
182
|
+
# The :cpu_usage is in percentage. It's also divided with the number
|
183
|
+
# of CPU. :cpu_usage for example, will return 25.0 if the CPU count
|
184
|
+
# is 4, and the process is using 100% of a thread / core.
|
185
|
+
# A value of 100.0 indicates it is using 100% processing power.
|
186
|
+
#
|
187
|
+
# The :threads returns the number of threads for the process.
|
188
|
+
# The value is a Integer.
|
189
|
+
#
|
190
|
+
# Note 2:
|
191
|
+
# If you just need the CPU usage run LinuxStat::ProcessInfo.cpu_usage(pid = $$)
|
192
|
+
# If you just need the threads run LinuxStat::ProcessInfo.threads(pid = $$)
|
193
|
+
# If you just need the last executed CPU run LinuxStat::ProcessInfo.last_executed_cpu(pid = $$)
|
194
|
+
# Running this method is slower and it opens multiple files at once
|
195
|
+
#
|
196
|
+
# Only use this method if you need all of the data at once, in such case, it's more efficient to use this method.
|
197
|
+
#
|
198
|
+
# The :last_executed_cpu also returns an Integer indicating
|
199
|
+
# the last executed cpu of the process.
|
200
|
+
def cpu_stat(pid: $$, sleep: 0.05)
|
201
|
+
file = "/proc/#{pid}/stat"
|
202
|
+
return {} unless File.readable?(file)
|
203
|
+
|
204
|
+
ticks = get_ticks
|
205
|
+
|
206
|
+
utime, stime, starttime = IO.read(file)
|
207
|
+
.split.values_at(13, 14, 21).map(&:to_f)
|
208
|
+
uptime = IO.read('/proc/uptime'.freeze).to_f * ticks
|
209
|
+
|
210
|
+
total_time = utime + stime
|
211
|
+
idle1 = uptime - starttime - total_time
|
212
|
+
|
213
|
+
sleep(sleep)
|
214
|
+
stat = IO.read(file).split
|
215
|
+
|
216
|
+
utime2, stime2, starttime2 = stat.values_at(13, 14, 21).map(&:to_f)
|
217
|
+
uptime = IO.read('/proc/uptime'.freeze).to_f * ticks
|
218
|
+
|
219
|
+
total_time2 = utime2 + stime2
|
220
|
+
idle2 = uptime - starttime2 - total_time2
|
221
|
+
|
222
|
+
totald = idle2.+(total_time2).-(idle1 + total_time)
|
223
|
+
cpu = totald.-(idle2 - idle1).fdiv(totald).*(100).round(2).abs./(LinuxStat::CPU.count)
|
224
|
+
|
225
|
+
{
|
226
|
+
cpu_usage: cpu,
|
227
|
+
threads: stat[19].to_i,
|
228
|
+
last_executed_cpu: stat[38].to_i
|
229
|
+
}
|
230
|
+
end
|
231
|
+
|
232
|
+
# cpu_usage(pid: $$, sleep: 0.05)
|
233
|
+
# Where pid is the process ID and sleep time is the interval between measurements.
|
234
|
+
# By default it is the id of the current process ($$), and sleep is 0.05
|
235
|
+
#
|
236
|
+
# It retuns the CPU usage in Float.
|
237
|
+
# For example:
|
238
|
+
# 10.0
|
239
|
+
# A value of 100.0 indicates it is using 100% processing power.
|
240
|
+
#
|
241
|
+
# But if the info isn't available, it will return nil.
|
242
|
+
#
|
243
|
+
# This method is more efficient than running LinuxStat::ProcessInfo.cpu_stat()
|
244
|
+
def cpu_usage(pid: $$, sleep: 0.05)
|
245
|
+
file = "/proc/#{pid}/stat"
|
246
|
+
return nil unless File.readable?(file)
|
247
|
+
|
248
|
+
ticks = get_ticks
|
249
|
+
|
250
|
+
utime, stime, starttime = IO.read(file)
|
251
|
+
.split.values_at(13, 14, 21).map(&:to_f)
|
252
|
+
uptime = IO.read('/proc/uptime'.freeze).to_f * ticks
|
253
|
+
|
254
|
+
total_time = utime + stime
|
255
|
+
idle1 = uptime - starttime - total_time
|
256
|
+
|
257
|
+
sleep(sleep)
|
258
|
+
|
259
|
+
utime2, stime2, starttime2 = IO.read(file)
|
260
|
+
.split.values_at(13, 14, 21).map(&:to_f)
|
261
|
+
uptime = IO.read('/proc/uptime'.freeze).to_f * ticks
|
262
|
+
|
263
|
+
total_time2 = utime2 + stime2
|
264
|
+
idle2 = uptime - starttime2 - total_time2
|
265
|
+
|
266
|
+
totald = idle2.+(total_time2).-(idle1 + total_time)
|
267
|
+
totald.-(idle2 - idle1).fdiv(totald).*(100).round(2).abs./(LinuxStat::CPU.count)
|
268
|
+
end
|
269
|
+
|
270
|
+
# threads(pid = $$)
|
271
|
+
# Where pid is the process ID.
|
272
|
+
# By default it is the id of the current process ($$)
|
273
|
+
#
|
274
|
+
# It retuns the threads for the current process in Integer.
|
275
|
+
# For example:
|
276
|
+
# 1
|
277
|
+
# But if the info isn't available, it will return nil.
|
278
|
+
#
|
279
|
+
# This method is way more efficient than running LinuxStat::ProcessInfo.cpu_stat()
|
280
|
+
def threads(pid = $$)
|
281
|
+
file = "/proc/#{pid}/stat".freeze
|
282
|
+
return nil unless File.readable?(file)
|
283
|
+
|
284
|
+
IO.read(file).split[19].to_i
|
285
|
+
end
|
286
|
+
|
287
|
+
# last_executed_cpu(pid = $$)
|
288
|
+
# Where pid is the process ID.
|
289
|
+
# By default it is the id of the current process ($$)
|
290
|
+
#
|
291
|
+
# It retuns the last executed CPU in Integer.
|
292
|
+
# For example:
|
293
|
+
# 2
|
294
|
+
# But if the info isn't available, it will return nil.
|
295
|
+
#
|
296
|
+
# This method is way more efficient than running LinuxStat::ProcessInfo.cpu_stat()
|
297
|
+
def last_executed_cpu(pid = $$)
|
298
|
+
file = "/proc/#{pid}/stat".freeze
|
299
|
+
return nil unless File.readable?(file)
|
300
|
+
|
301
|
+
IO.read("/proc/#{pid}/stat".freeze).split[38].to_i
|
302
|
+
end
|
303
|
+
|
304
|
+
private
|
305
|
+
def get_ticks
|
306
|
+
@@ticks ||= Sysconf.sc_clk_tck
|
307
|
+
end
|
308
|
+
end
|
309
|
+
end
|
310
|
+
end
|
data/lib/linux_stat/swap.rb
CHANGED
@@ -21,6 +21,7 @@ module LinuxStat
|
|
21
21
|
|
22
22
|
# Show aggregated used and available swap.
|
23
23
|
# The values are in kilobytes.
|
24
|
+
#
|
24
25
|
# The return type is Hash.
|
25
26
|
# If the info isn't available, the return type is an empty Hash.
|
26
27
|
def stat
|
@@ -44,6 +45,7 @@ module LinuxStat
|
|
44
45
|
|
45
46
|
# Show total amount of swap.
|
46
47
|
# The value is in kilobytes.
|
48
|
+
#
|
47
49
|
# The return type is a Integer but if the info isn't available, it will return nil.
|
48
50
|
def total
|
49
51
|
return nil unless swaps_readable?
|
@@ -52,6 +54,7 @@ module LinuxStat
|
|
52
54
|
|
53
55
|
# Show total amount of available swap.
|
54
56
|
# The value is in kilobytes.
|
57
|
+
#
|
55
58
|
# The return type is a Integer but if the info isn't available, it will return nil.
|
56
59
|
def available
|
57
60
|
return nil unless swaps_readable?
|
@@ -61,6 +64,7 @@ module LinuxStat
|
|
61
64
|
|
62
65
|
# Show total amount of used swap.
|
63
66
|
# The value is in kilobytes.
|
67
|
+
#
|
64
68
|
# The return type is a Integer but if the info isn't available, it will return nil.
|
65
69
|
def used
|
66
70
|
return nil unless swaps_readable?
|
@@ -79,7 +83,8 @@ module LinuxStat
|
|
79
83
|
values_t[-1].sum.*(100).fdiv(total).round(2)
|
80
84
|
end
|
81
85
|
|
82
|
-
#
|
86
|
+
# Shows the percentage of swap available.
|
87
|
+
#
|
83
88
|
# The return type is a Float but if the info isn't available, it will return nil.
|
84
89
|
def percent_available
|
85
90
|
return nil unless swaps_readable?
|
data/lib/linux_stat/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: linux_stat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sourav Goswami
|
@@ -15,8 +15,9 @@ email:
|
|
15
15
|
- souravgoswami@protonmail.com
|
16
16
|
executables: []
|
17
17
|
extensions:
|
18
|
-
- ext/utsname/extconf.rb
|
19
18
|
- ext/fs_stat/extconf.rb
|
19
|
+
- ext/sysconf/extconf.rb
|
20
|
+
- ext/utsname/extconf.rb
|
20
21
|
extra_rdoc_files:
|
21
22
|
- README.md
|
22
23
|
files:
|
@@ -26,6 +27,8 @@ files:
|
|
26
27
|
- bin/setup
|
27
28
|
- ext/fs_stat/extconf.rb
|
28
29
|
- ext/fs_stat/fs_stat.c
|
30
|
+
- ext/sysconf/extconf.rb
|
31
|
+
- ext/sysconf/sysconf.c
|
29
32
|
- ext/utsname/extconf.rb
|
30
33
|
- ext/utsname/utsname.c
|
31
34
|
- lib/linux_stat.rb
|
@@ -39,6 +42,7 @@ files:
|
|
39
42
|
- lib/linux_stat/net.rb
|
40
43
|
- lib/linux_stat/os.rb
|
41
44
|
- lib/linux_stat/process.rb
|
45
|
+
- lib/linux_stat/process_info.rb
|
42
46
|
- lib/linux_stat/swap.rb
|
43
47
|
- lib/linux_stat/version.rb
|
44
48
|
homepage: https://github.com/Souravgoswami/linux_stat/
|