Good Script on Collecting SAR and Process Data for CentOS:

#!/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)"
  • Make the script executable and then execute it:
chmod +x monitor.sh
./monitor.sh
  • To kill the script, please run this command:
kill $(cat /tmp/monitor_pids)

Updated: