linux_stat 2.5.0 → 2.5.3
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/lib/linux_stat/cpu.rb +38 -7
- data/lib/linux_stat/pci.rb +2 -2
- data/lib/linux_stat/thermal.rb +38 -12
- data/lib/linux_stat/usb.rb +2 -2
- data/lib/linux_stat/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 75ee9aa13037e326a0c04626cd28e0903b06372ce24344ffa38870f98dd6f0dd
|
4
|
+
data.tar.gz: d275807c8a9572fa9faaa1c562102302697f52b6a1cb36907fa71b2576c533b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3bd3330e9135cffee27a82fc661462a9c94e421ee5eebe24fb322ad9241e5498bdfd84914fd58dab93481366969f414bf2aa93e9507bb967ca18a462c91fc007
|
7
|
+
data.tar.gz: 686e7f1935fea8cde6ae24624522ef642f41e21304fdae7e758f3249f3b026ea6261a77fca76bbc2f5153d1d8426f9112a1b66f124e7c3d03106c0992ca731aa
|
data/lib/linux_stat/cpu.rb
CHANGED
@@ -21,24 +21,53 @@ module LinuxStat
|
|
21
21
|
#
|
22
22
|
# => {0=>84.38, 1=>100.0, 2=>50.0, 3=>87.5, 4=>87.5}
|
23
23
|
#
|
24
|
+
# It discards any offline CPU or disabled CPU.
|
25
|
+
# For example, if your system CPU has 4 cores, and you disabled core 3, the output will be:
|
26
|
+
# LinuxStat::CPU.stat
|
27
|
+
#
|
28
|
+
# => {0=>26.67, 1=>0.0, 2=>20.0, 4=>20.0}
|
29
|
+
#
|
24
30
|
# If the information is not available, it will return an empty Hash
|
25
31
|
def stat(sleep = ticks_to_ms_t5)
|
26
32
|
return {} unless stat?
|
27
33
|
|
28
|
-
data = IO.readlines('/proc/stat'.freeze).select { |x| x[/^cpu\d*/] }
|
34
|
+
data = IO.readlines('/proc/stat'.freeze).select { |x| x[/^cpu\d*/] }
|
35
|
+
cpu_names1 = []
|
36
|
+
data.map! { |x|
|
37
|
+
splitted = x.split
|
38
|
+
name = splitted.shift[/\d*$/]
|
39
|
+
cpu_names1.push(name.empty? ? 0 : name.to_i + 1)
|
40
|
+
splitted.map!(&:to_f)
|
41
|
+
}
|
42
|
+
|
29
43
|
sleep(sleep)
|
30
|
-
data2 = IO.readlines('/proc/stat'.freeze).select { |x| x[/^cpu\d*/] }
|
44
|
+
data2 = IO.readlines('/proc/stat'.freeze).select { |x| x[/^cpu\d*/] }
|
45
|
+
|
46
|
+
cpu_names2 = []
|
47
|
+
data2.map! { |x|
|
48
|
+
splitted = x.split
|
49
|
+
name = splitted.shift[/\d*$/]
|
50
|
+
cpu_names2.push(name.empty? ? 0 : name.to_i + 1)
|
51
|
+
splitted.map!(&:to_f)
|
52
|
+
}
|
31
53
|
|
32
54
|
# On devices like android, the core count can change anytime (hotplugging).
|
33
55
|
# I had crashes on Termux.
|
34
56
|
# So better just count the min number of CPU and iterate over that
|
35
57
|
# If data.length is smaller than data2.length, we don't have enough data to compare.
|
36
|
-
dl, d2l =
|
37
|
-
|
58
|
+
dl, d2l = cpu_names1.length, cpu_names2.length
|
59
|
+
if dl > d2l
|
60
|
+
min = d2l
|
61
|
+
cpu_cores = cpu_names2
|
62
|
+
else
|
63
|
+
min = dl
|
64
|
+
cpu_cores = cpu_names1
|
65
|
+
end
|
38
66
|
|
39
67
|
min.times.reduce({}) do |h, x|
|
40
|
-
|
41
|
-
|
68
|
+
cpu_core = cpu_cores[x]
|
69
|
+
user, nice, sys, idle, iowait, irq, softirq, steal = *data[x]
|
70
|
+
user2, nice2, sys2, idle2, iowait2, irq2, softirq2, steal2 = *data2[x]
|
42
71
|
|
43
72
|
idle_then, idle_now = idle + iowait, idle2 + iowait2
|
44
73
|
totald = idle_now.+(user2 + nice2 + sys2 + irq2 + softirq2 + steal2) - idle_then.+(user + nice + sys + irq + softirq + steal)
|
@@ -46,7 +75,7 @@ module LinuxStat
|
|
46
75
|
res = totald.-(idle_now - idle_then).fdiv(totald).abs.*(100)
|
47
76
|
res = res.nan? ? 0.0 : res > 100 ? 100.0 : res.round(2)
|
48
77
|
|
49
|
-
h.store(
|
78
|
+
h.store(cpu_core, res)
|
50
79
|
h
|
51
80
|
end
|
52
81
|
end
|
@@ -315,6 +344,7 @@ module LinuxStat
|
|
315
344
|
physical_cores = []
|
316
345
|
hyperthreaded = {}
|
317
346
|
|
347
|
+
return [] unless File.executable?('/sys/devices/system/cpu/'.freeze)
|
318
348
|
entries = Dir.entries('/sys/devices/system/cpu/'.freeze)
|
319
349
|
entries.delete(?..freeze)
|
320
350
|
entries.delete('..'.freeze)
|
@@ -354,6 +384,7 @@ module LinuxStat
|
|
354
384
|
def hyperthreaded_core_list
|
355
385
|
hyperthreaded = {}
|
356
386
|
|
387
|
+
return [] unless File.executable?('/sys/devices/system/cpu/'.freeze)
|
357
388
|
entries = Dir.entries('/sys/devices/system/cpu/'.freeze)
|
358
389
|
entries.delete(?..freeze)
|
359
390
|
entries.delete('..'.freeze)
|
data/lib/linux_stat/pci.rb
CHANGED
@@ -128,7 +128,7 @@ module LinuxStat
|
|
128
128
|
# Also note that if there's no info available or no PCI enabled devices, it will return an empty
|
129
129
|
# Hash.
|
130
130
|
def devices_stat(hwdata: true)
|
131
|
-
@@sys_pci_readable ||= File.
|
131
|
+
@@sys_pci_readable ||= File.executable?('/sys/bus/pci/devices/')
|
132
132
|
return devices_info(hwdata: hwdata) unless @@sys_pci_readable
|
133
133
|
|
134
134
|
Dir['/sys/bus/pci/devices/*/'.freeze].sort!.map! { |x|
|
@@ -215,7 +215,7 @@ module LinuxStat
|
|
215
215
|
# But if the information isn't available, it will return nil.
|
216
216
|
def count
|
217
217
|
@@proc_pci_readable ||= File.readable?('/proc/bus/pci/devices')
|
218
|
-
@@sys_pci_readable ||= File.
|
218
|
+
@@sys_pci_readable ||= File.executable?('/sys/bus/pci/devices/')
|
219
219
|
|
220
220
|
if @@proc_pci_readable
|
221
221
|
IO.readlines('/proc/bus/pci/devices'.freeze).length
|
data/lib/linux_stat/thermal.rb
CHANGED
@@ -64,7 +64,7 @@ module LinuxStat
|
|
64
64
|
|
65
65
|
private
|
66
66
|
def hwmon_readable?
|
67
|
-
@@hwmon_readable ||= File.
|
67
|
+
@@hwmon_readable ||= File.executable?("/sys/class/hwmon/")
|
68
68
|
end
|
69
69
|
|
70
70
|
def query_hwmon(mon, key, div = false)
|
@@ -78,20 +78,46 @@ module LinuxStat
|
|
78
78
|
|
79
79
|
while x = files[i += 1]
|
80
80
|
splitted = File.split(x)
|
81
|
-
|
82
|
-
|
83
|
-
n = splitted[-1][/.*_/]
|
81
|
+
n = splitted.pop[/.*_/]
|
82
|
+
path = File.join(splitted)
|
84
83
|
|
85
84
|
label_f = "#{path}/#{n}label"
|
86
|
-
|
85
|
+
|
86
|
+
# Some of the files may have no content
|
87
|
+
# They can also raise Errno::EIO, Errno::ENODATA as well.
|
88
|
+
label = if File.readable?(label_f)
|
89
|
+
begin
|
90
|
+
IO.read(label_f, encoding: 'ASCII-8BIT'.freeze).strip
|
91
|
+
rescue Errno::EIO, Errno::ENODEV, Errno::ENODATA
|
92
|
+
nil
|
93
|
+
end
|
94
|
+
end
|
87
95
|
|
88
96
|
temp_crit_f = "#{path}/#{n}crit"
|
89
|
-
temp_crit = File.readable?(temp_crit_f)
|
97
|
+
temp_crit = if File.readable?(temp_crit_f)
|
98
|
+
begin
|
99
|
+
IO.read(temp_crit_f, encoding: 'ASCII-8BIT'.freeze).to_i
|
100
|
+
rescue Errno::EIO, Errno::ENODEV, Errno::ENODATA
|
101
|
+
nil
|
102
|
+
end
|
103
|
+
end
|
90
104
|
|
91
105
|
temp_max_f = "#{path}/#{n}max"
|
92
|
-
temp_max = File.readable?(temp_max_f)
|
106
|
+
temp_max = if File.readable?(temp_max_f)
|
107
|
+
begin
|
108
|
+
IO.read(temp_max_f, encoding: 'ASCII-8BIT'.freeze).to_i
|
109
|
+
rescue Errno::EIO, Errno::ENODEV, Errno::ENODATA
|
110
|
+
nil
|
111
|
+
end
|
112
|
+
end
|
93
113
|
|
94
|
-
value = File.readable?(x)
|
114
|
+
value = if File.readable?(x)
|
115
|
+
begin
|
116
|
+
IO.read(x).to_i
|
117
|
+
rescue Errno::EIO, Errno::ENODEV, Errno::ENODATA
|
118
|
+
nil
|
119
|
+
end
|
120
|
+
end
|
95
121
|
|
96
122
|
if dir != path
|
97
123
|
dir = path
|
@@ -100,17 +126,17 @@ module LinuxStat
|
|
100
126
|
end
|
101
127
|
|
102
128
|
if div
|
103
|
-
value /= 1000.0
|
129
|
+
value /= 1000.0 if value
|
104
130
|
temp_max /= 1000.0 if temp_max
|
105
131
|
temp_crit /= 1000.0 if temp_crit
|
106
132
|
end
|
107
133
|
|
108
134
|
h = {path: path, name: name}
|
109
135
|
|
110
|
-
h.store(:label, label)
|
136
|
+
h.store(:label, label)
|
111
137
|
h.store(key, value)
|
112
|
-
h.store(:temp_crit, temp_crit)
|
113
|
-
h.store(:temp_crit, temp_max)
|
138
|
+
h.store(:temp_crit, temp_crit)
|
139
|
+
h.store(:temp_crit, temp_max)
|
114
140
|
|
115
141
|
ret.push(h)
|
116
142
|
end
|
data/lib/linux_stat/usb.rb
CHANGED
@@ -47,7 +47,7 @@ module LinuxStat
|
|
47
47
|
# Also note that if there's no info available or no USB devices, it will return an empty
|
48
48
|
# Hash.
|
49
49
|
def devices_stat(hwdata: true)
|
50
|
-
@@sys_usb_readable ||= File.
|
50
|
+
@@sys_usb_readable ||= File.executable?('/sys/bus/usb/devices/')
|
51
51
|
return [] unless @@sys_usb_readable
|
52
52
|
|
53
53
|
Dir['/sys/bus/usb/devices/*/'.freeze].sort!.map! { |x|
|
@@ -137,7 +137,7 @@ module LinuxStat
|
|
137
137
|
#
|
138
138
|
# But if the information isn't available, it will return nil.
|
139
139
|
def count
|
140
|
-
@@sys_usb_readable ||= File.
|
140
|
+
@@sys_usb_readable ||= File.executable?('/sys/bus/usb/devices/')
|
141
141
|
return nil unless @@sys_usb_readable
|
142
142
|
|
143
143
|
Dir['/sys/bus/usb/devices/*/'.freeze].count { |x|
|
data/lib/linux_stat/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: linux_stat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sourav Goswami
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Linux only, efficient linux system utilization reporting and system monitoring
|
14
14
|
gem
|
@@ -90,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
90
|
- !ruby/object:Gem::Version
|
91
91
|
version: '0'
|
92
92
|
requirements: []
|
93
|
-
rubygems_version: 3.
|
93
|
+
rubygems_version: 3.3.8
|
94
94
|
signing_key:
|
95
95
|
specification_version: 4
|
96
96
|
summary: Efficient linux system reporting gem
|