Skip to content

Instantly share code, notes, and snippets.

@essingen123
Created August 1, 2023 01:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save essingen123/37572251d4a022b771202dc8f518a62e to your computer and use it in GitHub Desktop.
Save essingen123/37572251d4a022b771202dc8f518a62e to your computer and use it in GitHub Desktop.
Script for displaying some cpu and memory usage on a mac, may work on other OS:es too
#!/usr/bin/env python3
import os
import time
from collections import deque
# Check if required libraries are installed. If not, install them.
libraries = {
"psutil": "psutil",
"curses": "windows-curses" if os.name == "nt" else "curses"
}
for lib, package in libraries.items():
try:
__import__(lib)
except ImportError:
os.system(f"pip install {package}")
import psutil
import curses
# Store history in deques
process_history = deque(maxlen=100)
sysinfo_history = deque(maxlen=100)
def get_system_info():
load_avg = os.getloadavg()[0]
cpu_usage = psutil.cpu_percent()
memory_usage = psutil.virtual_memory().percent
disk_io = psutil.disk_io_counters()
net_io = psutil.net_io_counters()
disk_read = disk_io.read_bytes / (1024 * 1024) # Convert bytes to MB
disk_write = disk_io.write_bytes / (1024 * 1024) # Convert bytes to MB
net_sent = net_io.bytes_sent / (1024 * 1024) # Convert bytes to MB
net_recv = net_io.bytes_recv / (1024 * 1024) # Convert bytes to MB
disk_usage = psutil.disk_usage('/')
net_ifs = psutil.net_if_stats()
# Store in history
sysinfo_history.append((load_avg, cpu_usage, memory_usage, disk_read, disk_write, net_sent, net_recv, disk_usage, net_ifs))
return load_avg, cpu_usage, memory_usage, disk_read, disk_write, net_sent, net_recv, disk_usage, net_ifs
def get_top_processes():
cpu_processes = [(proc.pid, proc.info['name'], proc.info['cpu_percent'] or 0) for proc in psutil.process_iter(['name', 'cpu_percent'])]
cpu_processes.sort(key=lambda x: x[2], reverse=True)
cpu_processes = cpu_processes[:10]
mem_processes = [(proc.pid, proc.info['name'], proc.info['memory_percent'] or 0) for proc in psutil.process_iter(['name', 'memory_percent'])]
mem_processes.sort(key=lambda x: x[2], reverse=True)
mem_processes = mem_processes[:10]
# Store in history
process_history.append((cpu_processes, mem_processes))
return cpu_processes, mem_processes
def display_system_info(stdscr, data):
stdscr.clear()
load_avg, cpu_usage, memory_usage, disk_read, disk_write, net_sent, net_recv, disk_usage, net_ifs = data
stdscr.addstr(f'Load Average: {load_avg:.2f} CPU Usage: {cpu_usage:.2f}% Memory Usage: {memory_usage:.2f}%\n')
stdscr.addstr(f'Disk Read: {disk_read:010.4f} MB Disk Write: {disk_write:010.4f} MB\n')
stdscr.addstr(f'Network Sent: {net_sent:010.4f} MB Network Received: {net_recv:010.4f} MB\n')
stdscr.addstr(f'Disk Usage: {disk_usage.percent}%\n\n')
def display_processes(stdscr, data):
cpu, mem = data
stdscr.addstr('Top CPU Processes:\n')
stdscr.addstr(f'{"PID":<10}{"Command":<30}{"%CPU"}\n')
for process in cpu:
stdscr.addstr(f'{process[0]:<10}{process[1]:<30}{process[2]:.2f}\n')
stdscr.addstr('\nTop Memory Processes:\n')
stdscr.addstr(f'{"PID":<10}{"Command":<30}{"%MEM"}\n')
for process in mem:
stdscr.addstr(f'{process[0]:<10}{process[1]:<30}{process[2]:.2f}\n')
stdscr.addstr('\nPress Ctrl+C to exit\n')
def main(stdscr):
while True:
# Get data
get_system_info()
get_top_processes()
# Display data from history
display_system_info(stdscr, sysinfo_history[-1])
display_processes(stdscr, process_history[-1])
# Refresh and sleep
stdscr.refresh()
time.sleep(1)
# Initialize curses and start main loop
curses.wrapper(main)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment