Created
August 1, 2023 01:41
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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