|
#!/bin/bash
|
|
|
|
# Author: Pekka Helenius (~Fincer), 2018
|
|
# Collect system statistics at regular intervals
|
|
|
|
# Check if the following file exists. If not, exit the script.
|
|
[[ $(ls /etc/default/sysstat) ]] || exit
|
|
|
|
# Enable stats
|
|
[[ $(cat /etc/default/sysstat | grep "ENABLED=\"true\"") ]] || sudo sed -i 's/ENABLED.*/ENABLED="true"/' /etc/default/sysstat
|
|
|
|
# How many days we take stats
|
|
DAYS=2
|
|
DATE_INTERVAL=$(echo $(date +%Y-%m-%d)_$(date +%Y-%m-%d -d "+$DAYS days"))
|
|
|
|
# Interval of stats in seconds
|
|
INTERVAL=20
|
|
|
|
# Logs dir
|
|
SARDIR=$HOME/sar_statistics
|
|
SARSTAT_FILE=$SARDIR/sar_stats_$DATE_INTERVAL.file
|
|
PIDSTAT_DIR=$SARDIR/pidstats
|
|
|
|
##############
|
|
[[ -d $PIDSTAT_DIR ]] || mkdir -p $PIDSTAT_DIR
|
|
DAYS_SEC=$(( DAYS * 60 * 60 * 24))
|
|
COUNT=$(( DAYS_SEC / INTERVAL ))
|
|
##############
|
|
|
|
# Ignore HANGUP signal. By setting this, we continue running commands presented below though this script has exited
|
|
# Alternatively, use 'nohup' before any command execution. NOTE: 'nohup' doesn't work with functions
|
|
trap "" HUP
|
|
|
|
# Gather data for analysis
|
|
# alternatively use 'nohup' as a prefix for this command
|
|
sar $INTERVAL $COUNT -o $SARSTAT_FILE &>/dev/null &
|
|
disown
|
|
|
|
##########################################
|
|
# How to print out statistics?
|
|
|
|
# CPU
|
|
# sar -u -f $SARSTAT_FILE
|
|
|
|
# Memory
|
|
# sar -r -f $SARSTAT_FILE
|
|
|
|
# Mounted filesystems
|
|
# sar -F MOUNT / -f $SARSTAT_FILE
|
|
|
|
# Swap space stats
|
|
# sar -S -f $SARSTAT_FILE
|
|
|
|
# Network devices
|
|
# sar -n DEV -f $SARSTAT_FILE
|
|
|
|
# Network devices - errors
|
|
# sar -n EDEV -f $SARSTAT_FILE
|
|
|
|
# Network IPv4 sockets
|
|
# sar -n SOCK -f $SARSTAT_FILE
|
|
|
|
# Network IPv6 sockets
|
|
# sar -n SOCK6 -f $SARSTAT_FILE
|
|
|
|
# Network IPv4 traffic statistics
|
|
# sar -n IP -f $SARSTAT_FILE
|
|
|
|
# Network IPv4 traffic statistics - errors
|
|
# sar -n EIP -f $SARSTAT_FILE
|
|
|
|
# Network IPv6 traffic statistics
|
|
# sar -n IP6 -f $SARSTAT_FILE
|
|
|
|
# Network IPv6 traffic statistics - errors
|
|
# sar -n EIP6 -f $SARSTAT_FILE
|
|
|
|
# Network TCP protocol statistics
|
|
# sar -n TCP -f $SARSTAT_FILE
|
|
|
|
# Network TCP protocol statistics - errors
|
|
# sar -n ETCP -f $SARSTAT_FILE
|
|
|
|
# Inode, file etc. stats
|
|
# sar -v -f $SARSTAT_FILE
|
|
|
|
# Tasks statistics
|
|
# sar -w -f $SARSTAT_FILE
|
|
|
|
##########################################
|
|
# Pidstat
|
|
|
|
function pidstats() {
|
|
while [[ $DAYS_SEC -ge 0 ]]; do
|
|
|
|
pidstat -d >> $PIDSTAT_DIR/pidstat_stats_io_$DATE_INTERVAL
|
|
# pidstat -R >> $PIDSTAT_DIR/pidstat_stats_realtime_$DATE_INTERVAL
|
|
pidstat -r >> $PIDSTAT_DIR/pidstat_stats_pagefaults_$DATE_INTERVAL
|
|
pidstat -s >> $PIDSTAT_DIR/pidstat_stats_stacks_$DATE_INTERVAL
|
|
pidstat -u >> $PIDSTAT_DIR/pidstat_stats_cpu-tasks_$DATE_INTERVAL
|
|
pidstat -v >> $PIDSTAT_DIR/pidstat_stats_kerneltables_$DATE_INTERVAL
|
|
|
|
# We want to interrupt this loop if previous pidstat commands fail.
|
|
if [[ ! $? == 0 ]]; then
|
|
break 1
|
|
fi
|
|
|
|
DAYS_SEC=$(( DAYS_SEC - INTERVAL ))
|
|
sleep $INTERVAL
|
|
|
|
done
|
|
|
|
}
|
|
|
|
pidstats &
|
|
echo -e "Collecting statistics with 'sar' and 'pidstat' commands for the following $DAYS days. All commands will stop at $(date '+%H:%M on %Y-%m-%d' -d '+2 days')."
|
|
disown
|