#!/bin/bash
# CONFIG
INTERVAL=1
OUTDIR="/tmp"
HOST=$(hostname)
DATE=$(date +%F)
PIDFILE="/tmp/monitor_pids"
# Create output filenames
TOP_OUT="$OUTDIR/top-${HOST}-${DATE}.out"
VMSTAT_OUT="$OUTDIR/vmstat-${HOST}-${DATE}.out"
IOSTAT_OUT="$OUTDIR/iostat-${HOST}-${DATE}.out"
PS_OUT="$OUTDIR/ps-${HOST}-${DATE}.out"
PSH_OUT="$OUTDIR/psh-${HOST}-${DATE}.out"
FREE_OUT="$OUTDIR/free-${HOST}-${DATE}.out"
SAR_OUT="$OUTDIR/sar-${HOST}-${DATE}.out"
# Cleanup old PID file
rm -f "$PIDFILE"
# Function to prepend timestamp and append output
run_every_second() {
local cmd="$1"
local outfile="$2"
(
while true; do
echo "==== $(date +%F-%H-%M-%S) ====" >> "$outfile"
echo "Hostname: $HOST" >> "$outfile"
echo "Date: $(date)" >> "$outfile"
eval "$cmd" >> "$outfile" 2>&1
sleep "$INTERVAL"
done
) &
echo $! >> "$PIDFILE"
}
# Start repeating commands
run_every_second "top -n 1 -b" "$TOP_OUT"
run_every_second "vmstat 1 2 | tail -n +4 | head -n 1" "$VMSTAT_OUT"
run_every_second "iostat -x 1 2 | tail -n +7" "$IOSTAT_OUT"
run_every_second "ps aux" "$PS_OUT"
run_every_second "ps auxH" "$PSH_OUT"
run_every_second "free" "$FREE_OUT"
# Run sar in background (nohup for real-time, not timestamped per line)
nohup sar -u -r -S -n DEV -d 1 > "$SAR_OUT" 2>&1 &
echo $! >> "$PIDFILE"
echo "Monitoring started. To stop, run: kill \$(cat $PIDFILE)"
chmod +x monitor.sh
./monitor.sh
kill $(cat /tmp/monitor_pids)