DEV Community

loading...

Get server stats with bash

decentralizuj profile image decentralizuj Updated on ・2 min read

This is script to get server stats printed in terminal and saved as txt output (or not). I will not explain each command, but for total beginners I will say that commands are piped with I, so take each command and use with -h in terminal to get more info.

# example to get help for awk
awk -h

# commands are piped with |
# get free memory with 'free'
# output it to 'tail' to print last line
free -m | tail -n 1 
Enter fullscreen mode Exit fullscreen mode

So here's the full script, you can remove # at last 2 lines to save output and/or show notification on desktop.

#!/usr/bin/env bash

#  Define Output Log-File (or not)

OUTPUT_LOG=~/sys-log.txt

#  Define Colors

  R="\e[0m" #reset
  U="\e[4m" #underline
  Y="\e[33m" #yellow
  RED="\e[37m" #light red

#  Format Date and Time

DATE=$(date +%m/%d/%Y)
TIME=$(date +%k:%M:%S)
DAY=$(date +%A)

#  User Logged In

USER=$(whoami)

#  System Uptime

UPTIME_S=$(uptime -s)
UPTIME_P=$(uptime -p)
UPTIME=$(uptime -s && uptime -p)

#  Free Memory

FREE=$(free -m | head -n 2 | tail -n 1 | awk {'print $4'})

#  Free Swap Memory

SWAP=$(free -m | tail -n 1 | awk {'print $3'})

#  CPU Idle

CPU=$(vmstat 1 2 | sed -n '/[0-9]/p' | sed -n '2p' | awk '{print $15}')

#  Free Disk Space

SPACE=$(df -h / | awk '{ a = $4 } END { print a }')

#  Define banner to print

  banner() {

    echo ----------------------------------------------------------------------
    echo -e "$RED" DAY: "$R"$DAY "$RED"'\t'DATE: "$R"$DATE "$RED"'\t'TIME: "$R"$TIME"$R"
    echo ----------------------------------------------------------------------
}

#  Define nice-print stats

  print_stats() {

    echo -e "$R"WELCOME:"$R"'\t|\t'"$Y"$USER

    echo -e "$R"UPTIME: "$R"'\t|\t'"$Y"$UPTIME

    echo -e "$R"FREE MEMORY:"$R"'\t|\t'"$Y"$FREE MB

    echo -e "$R"FREE SWAP:"$R"'\t|\t'"$Y"$SWAP MB

    echo -e "$R"CPU IDLE:"$R"'\t|\t'"$Y"$CPU %

    echo -e "$R"DISK SPACE:"$R"'\t|\t'"$Y"$SPACE
}

#  Define One-Line output log

  output() {

    echo "$DATE | $TIME | $USER | $UPTIME_S | $UPTIME_P | $FREE MB | $SWAP MB | $CPU % | $SPACE"
}

### ### ###

#  Execute Defined Functions

  clear && banner           # Print Banner

  print_stats               # Print Stats

#  output >> $OUTPUT_LOG     # Save Output (or not)

#  Display Desktop Notification

#  ALERT=$(notify-send -u normal "Free Space :  $SPACE   |   CPU USAGE :  $CPU %  |   Free Mem :  $FREE MB") && echo -e $ALERT
Enter fullscreen mode Exit fullscreen mode

SysData Preview

Discussion (2)

Collapse
goodevilgenius profile image
Dan Jones

You've got a few possible improvements in here.

Here's what I found.

free -m | head -n 2 | tail -n 1 | awk {'print $4'}

# could be, like you use in CPU idle
free -m | sed -n 2p | awk '{print $4}'

# but more simply
free -m | awk 'NR == 2 {print $4}'
Enter fullscreen mode Exit fullscreen mode
free -m | tail -n 1 | awk {'print $3'}

# like you do with free space
free -m | awk 'END {print $3}'
Enter fullscreen mode Exit fullscreen mode
df -h / | awk '{ a = $4 } END { print a }'

# You don't need to store a variable here
df -h / | awk 'END { print $4 }'
Enter fullscreen mode Exit fullscreen mode
Collapse
decentralizuj profile image
decentralizuj Author

Thanks on pointing that out, I'll edit script with your improvements.

Forem Open with the Forem app