As enterprise infrastructures scale, ensuring high availability and proactive resource governance becomes a paramount responsibility for site reliability engineers (SREs) and Linux system administrators. Relying purely on reactive troubleshooting after a kernel panic or an Out-Of-Memory (OOM) killer event leads to severe service degradation. Implementing a lightweight, custom Python script to monitor Linux server metrics provides an immediate layer of observability before deploying heavier APM suites like Prometheus, Datadog, or New Relic.
Problem Statement & Root Cause Analysis
Production Linux servers routinely experience silent resource starvation. Common culprits include runaway background worker threads leaking heap memory, unrotated log files consuming 100% of the root partition inode or block space, and infinite processing loops spiking CPU cores to 100%. Traditional shell scripts utilizing awk, grep, and free are notoriously brittle across different Linux distributions (e.g., Debian vs. RHEL) due to subtle formatting discrepancies in system outputs.
The root cause of monitoring blindness often stems from over-engineered observability stacks that fail during network partitions, or alternatively, a total lack of localized fallback telemetry. Writing a dedicated, self-contained automation script in Python bridges this gap. It guarantees cross-platform compatibility, execution speed, and direct integration with existing incident-management webhooks.
System Metrics & psutil Implementation Matrix
| Metric Type | Target Parameter | psutil Function | Default Alert Threshold |
|---|---|---|---|
| CPU Load | 1-second interval usage | psutil.cpu_percent(interval=1) |
85.0% |
| Memory (RAM) | Active virtual memory used | psutil.virtual_memory().percent |
90.0% |
| Disk Partition | Root mount point usage | psutil.disk_usage('/') |
85.0% |
Step-by-Step Hands-On Implementation
- Step 1: Environment Provisioning & Dependencies — Update your package manager and install Python3 alongside pip and virtual environment utilities, then install the indispensable
psutilandrequestspackages. - Step 2: Script Architecture Design — Construct a modular script structure containing separate functions for data collection, alert evaluation, and webhook dispatching.
- Step 3: Integrating Webhook Payload Delivery — Format structured JSON payloads containing server hostnames, timestamp vectors, and specific breach metrics for transmission over HTTPS.
- Step 4: Scheduling via Systemd or Crontab — Automate periodic execution using system cron or persistent systemd timers to maintain continuous surveillance.
#!/usr/bin/env python3
"""
Author: Principal Systems Architect
Description: Production-ready Python script to monitor Linux server resources.
"""
import psutil
import requests
import socket
import sys
import time
# Configuration Constants
WEBHOOK_URL = "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
CPU_THRESHOLD = 85.0
RAM_THRESHOLD = 90.0
DISK_THRESHOLD = 85.0
HOSTNAME = socket.gethostname()
def send_alert(metric_name, current_value):
"""Dispatches an alert payload to the configured webhook endpoint."""
payload = {
"text": f":rotating_light: *CRITICAL ALERT* on `{HOSTNAME}`\n"
f"> *Metric:* {metric_name}\n"
f"> *Value:* `{current_value}%`\n"
f"> *Action Required:* Immediate investigation needed."
}
try:
response = requests.post(WEBHOOK_URL, json=payload, timeout=10)
response.raise_for_status()
except requests.exceptions.RequestException as e:
sys.stderr.write(f"[ERROR] Failed to dispatch webhook alert: {e}\n")
def monitor_system():
"""Polls system vitals and compares against defined thresholds."""
try:
cpu_usage = psutil.cpu_percent(interval=1)
ram = psutil.virtual_memory()
disk = psutil.disk_usage('/')
print(f"[INFO] Host: {HOSTNAME} | CPU: {cpu_usage}% | RAM: {ram.percent}% | Disk: {disk.percent}%")
if cpu_usage > CPU_THRESHOLD:
send_alert("CPU Utilization Exceeded", cpu_usage)
if ram.percent > RAM_THRESHOLD:
send_alert("RAM Utilization Exceeded", ram.percent)
if disk.percent > DISK_THRESHOLD:
send_alert("Root Disk Usage Exceeded", disk.percent)
except Exception as e:
sys.stderr.write(f"[ERROR] Exception encountered during metric collection: {e}\n")
if __name__ == "__main__":
monitor_system()
/tmp/) when executing monitoring scripts via cron. Without state checks, a sustained high CPU load will trigger a new webhook notification every single minute, resulting in alert fatigue and flooded communication channels.Verification & Testing
To verify that your automation script successfully detects resource spikes and dispatches webhook alerts without errors, perform a dry run execution directly in your terminal:
python3 monitor.py
To simulate high CPU load during testing, you can utilize the stress-ng utility:
sudo apt-get install stress-ng -y
stress-ng --cpu 4 --timeout 60s
Frequently Asked Questions about Python script to monitor Linux server
Can this script monitor specific mounted partitions other than the root directory?
Yes. You can iterate over all mounted block devices using psutil.disk_partitions() and pass each device mountpoint dynamically into psutil.disk_usage(partition.mountpoint) to evaluate separate data volumes or external storage arrays.
How do I prevent alert fatigue caused by continuous looping scripts?
You can introduce local caching or cooldown timers. By checking if a lock file exists with a timestamp in /tmp/, the script can suppress duplicate notifications for a defined window (e.g., 30 minutes) after the initial alert fires.
Is psutil faster than parsing Linux CLI utilities like top and df?
Significantly faster. psutil interfaces directly with the Linux kernel via system calls (reading from /proc and /sys filesystems under the hood), avoiding the computational overhead of spawning shell subprocesses and parsing string outputs.
Conclusion & Key Summary
Deploying a custom Python script to monitor Linux server infrastructure gives DevOps engineers complete transparency and granular control over critical hardware metrics. By leveraging the psutil module alongside structured webhook alerting, you establish a resilient, dependency-lean safety net that secures your infrastructure against unexpected resource exhaustion. Combine this script with systemd timers for reliable, enterprise-grade automated systems management.


![Workflow Belajar Mandiri Siswa: Menggunakan AI untuk Merangkum Catatan, Mind-Mapping, dan Persiapan Uji Kompetensi [Seri AI_EDUKASI #6]](https://www.edusoe.my.id/wp-content/uploads/2026/11/blog_featured_1794027618-150x150.jpg)