In today’s fast-paced IT environments, monitoring system resources in real time is crucial for maintaining the health and performance of servers. Whether you’re managing a proxy server or any other critical infrastructure, having a lightweight, customizable monitoring solution can make a big difference. In this blog post, I’ll walk you through how to create a real-time system monitoring dashboard using a Bash script. This script will allow you to keep an eye on CPU usage, network activity, disk space, and more—all from your terminal.
Why Bash?
Bash is a powerful and flexible tool that comes pre-installed on most Linux systems. While there are many sophisticated monitoring tools available, Bash offers a simple, no-frills approach that’s easy to customize and deploy. Plus, it’s a great way to deepen your understanding of system resources and shell scripting.
Key Features of the Script
The monitoring automation script we’ll build includes the following features:
- Top 10 Most Used Applications: Displays the top 10 processes consuming the most CPU and memory.
- Network Monitoring: Tracks the number of concurrent connections, packet drops, and data transfer rates.
- Disk Usage: Monitors disk space usage, highlighting partitions using more than 80% of their capacity.
- System Load: Shows the current load average and a detailed breakdown of CPU usage.
- Memory Usage: Provides an overview of total, used, and free memory, including swap usage.
- Process Monitoring: Lists the number of active processes and the top 5 resource-intensive ones.
-
Service Monitoring: Checks the status of essential services like
sshd
,nginx/apache
, andiptables
. - Custom Dashboard: Allows users to view specific sections of the dashboard using command-line switches.
Building the Script
Let’s dive into how we can build this script. Below is a breakdown of each section.
1. Monitoring Top Applications
To display the top 10 applications consuming the most CPU and memory, we use the ps
command combined with sort
:
ps aux --sort=-%cpu | head -n 11
ps aux --sort=-%mem | head -n 11
This provides a quick overview of the most resource-hungry processes.
2. Network Monitoring
For network monitoring, we need to track concurrent connections, packet drops, and data transfer rates. We use netstat
and ifconfig
for this:
netstat -an | grep ESTABLISHED | wc -l
ifconfig eth0 | grep 'RX packets'
ifconfig eth0 | grep 'TX packets'
These commands give us insights into the network activity in real-time.
3. Disk Usage
Monitoring disk usage is crucial for preventing storage issues. Here’s how we can highlight partitions using more than 80% of disk space:
df -h | awk '$5 > 80 {print $0}'
This snippet checks the disk usage and flags any partitions that exceed the 80% threshold.
4. System Load
To monitor the system load, we use the uptime
command:
uptime
This command gives a snapshot of the load average, which indicates how many processes are demanding CPU time.
5. Memory Usage
Memory usage is tracked using free
:
free -h
This provides a detailed look at total, used, and free memory, including swap space.
6. Process Monitoring
We can easily monitor active processes and identify the top 5 resource-intensive ones:
ps -e | wc -l
ps aux --sort=-%cpu | head -n 6
This combination helps in understanding the process load on the system.
7. Service Monitoring
Ensuring essential services are running is vital. We can check the status of critical services like sshd
and iptables
using systemctl
:
systemctl is-active sshd
systemctl is-active iptables
These checks ensure that critical services are operational and correctly configured.
8. Custom Dashboard
Finally, to make the script more flexible, we add command-line switches to allow users to view specific parts of the dashboard:
case "$1" in
-cpu) monitor_cpu ;;
-memory) monitor_memory ;;
-network) monitor_network ;;
-disk) monitor_disk ;;
*) echo "Usage: $0 {-cpu|-memory|-network|-disk}" ;;
esac
This modular approach makes it easy to focus on the metrics that matter most at any given time.
Lessons Learned
While building this script, I encountered a few challenges. For example, I initially forgot to install net-tools
, which includes the netstat
command necessary for network monitoring. This was quickly resolved by installing the package via sudo apt-get install net-tools
. Additionally, ensuring that the script was executable required setting the correct permissions with chmod +x
.
Conclusion
This Bash script provides a powerful, lightweight way to monitor system resources in real-time. It’s easy to customize and deploy, making it a valuable tool for anyone managing Linux servers. Whether you’re a seasoned sysadmin or just getting started with shell scripting, this project offers a hands-on way to deepen your understanding of system monitoring.
You can find the full script and documentation in my GitHub repository. Feel free to clone, modify, and use it as a starting point for your own monitoring solutions.