#!/usr/bin/env python3
import time
import subprocess
import sys
def read_file(filename):
with open(filename) as f:
return f.read()
def read_cpu_idle_jiffys(procstat):
line = procstat.split("\n")[0]
fields = line.split()
return int(fields[4])
def count_cpus(procstat):
count = -1
for line in procstat.split("\n"):
if line.startswith("cpu"):
count += 1
return count
def read_cpu_percent():
procstat = read_file("/proc/stat")
num_cpus = count_cpus(procstat)
tstart = time.time()
idle_jiffy1 = read_cpu_idle_jiffys(procstat)
time.sleep(0.1)
idle_jiffy2 = read_cpu_idle_jiffys(read_file("/proc/stat"))
tend = time.time()
duration = tend - tstart
idle_jiffys_per_second = (idle_jiffy2 - idle_jiffy1) / duration
idle_jiffys_per_cpu_second = idle_jiffys_per_second / num_cpus
# One jiffy is 10ms, so we can get the percentage very easily!
return 100 - idle_jiffys_per_cpu_second
def read_mem_percent():
meminfo = read_file("/proc/meminfo")
d = {}
for line in meminfo.strip().split("\n"):
key, value = line.split()[:2]
d[key] = int(value)
mem_total = d["MemTotal:"]
mem_free = d["MemAvailable:"]
mem_used = mem_total - mem_free
return mem_used / mem_total * 100
def read_battery_percent():
args = ["upower", "--show-info", "/org/freedesktop/UPower/devices/DisplayDevice"]
with subprocess.Popen(args, stdout=subprocess.PIPE) as process:
upower_data, _ = process.communicate()
if process.poll() != 0:
return
for line in upower_data.decode("ascii").split("\n"):
line = line.strip()
if line.startswith("percentage:"):
percent_str = line.split()[1]
return int(percent_str.replace("%", ""))
def write(s):
sys.stdout.write(s)
def print_percent(name, units, value, color_map):
if value is None:
return
value = round(value)
for low, high, color in color_map:
if value >= low and value <= high:
break
else:
color = "black"
write(
"%s %s%s " %
(name, color, value, units)
)
def main():
write("")
print_percent(
"cpu", "%",
read_cpu_percent(),
color_map=[(50, 100, "red"), (0, 5, "green")],
)
print_percent(
"mem", "%",
read_mem_percent(),
color_map=[(70, 100, "red")],
)
print_percent(
"batt", "%",
read_battery_percent(),
color_map=[(0, 25, "red")],
)
write("")
if __name__ == "__main__":
main()