|
|
- #!/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
|