added readme

This commit is contained in:
Linus Vogel 2026-03-15 22:57:11 +01:00
parent a686e144a8
commit dec5ac868c

173
Readme.md Normal file
View File

@ -0,0 +1,173 @@
# cputild - CPU Idle Time Monitor
## Overview
**cputild** is a lightweight daemon that continuously monitors CPU utilization by reading from `/proc/stat` and writes the current CPU usage percentage to `/tmp/cputild`. It's designed to run as a background service on Linux systems, providing real-time CPU metrics suitable for other tools to consume.
## Features
- **Continuous Monitoring**: Reads CPU statistics every second
- **Accurate Calculation**: Uses jiffies-based delta calculation for precise utilization
- **Signal Handling**: Gracefully responds to `SIGINT` (Ctrl+C) for clean shutdown
- **Daemon Ready**: Includes systemd service configuration for production use
- **Efficient I/O**: Reopens files on each iteration for volatile data sources
## Requirements
- **Operating System**: Linux (requires `/proc/stat` support)
- **Build Tools**: CMake 3.31+, GCC or compatible C11 compiler
- **Systemd**: For service management (optional)
## Building the Project
### Prerequisites
```bash
sudo apt install cmake build-essential # Debian/Ubuntu
sudo yum install cmake gcc # Fedora/CentOS
```
### Build Process
```bash
# Using the install script (recommended for production)
./install.sh
# Or manual build
mkdir build && cd build
cmake -S ../.. -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build .
# Optional: sudo cmake --install ../.. --prefix /usr/local
```
### Build Options
The `CMakeLists.txt` supports multiple build types:
- **Debug** (default): For development and debugging
- **Release**: Optimized without debug symbols
- **RelWithDebInfo** (used by install.sh): Optimized with debug info
```bash
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
```
## Installation
### Automated Installation
The provided `install.sh` script handles the complete installation process:
```bash
./install.sh
```
This script will:
1. Create a temporary build directory
2. Configure and build the project with `CMake`
3. Install the binary to `/usr/local/bin/cputild`
4. Copy and enable the systemd service
5. Reload systemd daemon
### Manual Installation
```bash
sudo cmake --install build --prefix /usr/local
sudo cp cputild.service /etc/systemd/system/cputild.service
sudo systemctl daemon-reload
sudo systemctl enable cputild.service
sudo systemctl start cputild.service
```
## Systemd Service
### Service Behavior
When running as a systemd service, cputild:
- Starts automatically on boot (if enabled)
- Restarts on failure (`Restart=on-failure`)
- Responds to `SIGINT` for graceful shutdown
### Management Commands
```bash
# Enable service (start on boot)
sudo systemctl enable cputild.service
# Start service
sudo systemctl start cputild.service
# Check status
sudo systemctl status cputild.service
# Stop service
sudo systemctl stop cputild.service
# Restart service
sudo systemctl restart cputild.service
# View logs
sudo journalctl -u cputild.service
```
## How It Works
### Algorithm
1. **Read** CPU statistics from `/proc/stat` (in jiffies)
2. **Parse** the first line: `cpu user nice system idle iowait irq softirq steal guest guest_nice`
3. **Calculate** active time = user + nice + system + irq + softirq + steal + guest + guest_nice
4. **Calculate** idle time = iowait + idle
5. **Compute** delta (difference) since last measurement
6. **Derive** utilization = active_delta / (active_delta + idle_delta) × 100
7. **Write** result to `/tmp/cputild` (percentage, 2 decimal places)
### Output Format
```
/tmp/cputild: 45.23
```
The file contains only the number (no newline) for easy parsing by other tools.
## Signal Handling
The program uses a simple volatile flag pattern for signal handling:
| Signal | Effect |
|--------|--------|
| `SIGINT` (Ctrl+C) | Gracefully sets `running=0` and terminates |
## Troubleshooting
### Permission Issues
```bash
# If you cannot write to /tmp/cputild
sudo chmod 666 /tmp
```
### Systemd Service Not Starting
```bash
# Check for errors
sudo systemctl status cputild.service -l
# Check journal logs
sudo journalctl -xeu cputild.service
```
### Manual Test
```bash
# Test in foreground
./build/cputild
# Verify output
cat /tmp/cputild
```
## File Structure
```
cputild/
├── CMakeLists.txt # Build configuration
├── install.sh # Installation script
├── cputild.service # systemd unit file
└── main.c # Source code
```
## Author
Linus Vogel <linus@linvogel.ch>
## License
Free to use and modify.
---
*Last Updated: 2026-03-15*