Files
ssd_health/templates/drive_check.sh
2025-12-06 17:42:26 -08:00

84 lines
4.0 KiB
Bash

#!/bin/bash
# this is a big loop
# it shows SSD health data
exec 2> /dev/null
while true; do
clear
# Show IP Info
echo ===Visit the IP in your browser to view history======
ip -o -4 ad | grep -v -e docker -e 127.0.0.1 -e br- | awk '{print $2 "," $4}' | column -s , -t
# get all disks
DISK_LIST=$(ls -lo /dev/sd? | awk '{print $9}')
# process each disk
IFS=$'\n' read -rd '' -a DISK_ARRAY <<< "$DISK_LIST"
for DISK in "${DISK_ARRAY[@]}"; do
# store smartctl data once
SMART_DATA=$(smartctl -x $DISK)
NVME_CHECK=$(echo "$SMART_DATA" | grep "NVMe Version")
SSD_CHECK=$(echo "$SMART_DATA" | grep "Rotation Rate" | grep "Solid State")
# if either SATA SSD or NVMe
if [ -n "$NVME_CHECK" ] || [ -n "$SSD_CHECK" ]; then
BLOCK_SIZE=$(fdisk -l $DISK | grep 'Sector size' | awk '{print $4}' )
# SATA Logic
if [ -n "$SSD_CHECK" ] ; then
# Set Variables
TBW=$(echo "$SMART_DATA" | grep "Logical Sectors Written" | \
awk -v BLOCK_SIZE="$BLOCK_SIZE" '{print $4 * BLOCK_SIZE / (2 ^ 40)}')
PLR=$(echo "$SMART_DATA" | grep Percent_Lifetime_Remain | awk '{print $4}')
CAPACITY=$(echo "$SMART_DATA" | grep "User Capacity" | cut -d '[' -f 2 | sed 's/]//g')
SERIAL=$(echo "$SMART_DATA" | grep "Serial Number" | cut -d ":" -f 2 | xargs)
MODEL=$(echo "$SMART_DATA" | grep "Device Model" | cut -d ":" -f 2 | xargs)
SMART=$(echo "$SMART_DATA" | grep "self-assessment test result" | cut -d ":" -f 2 | xargs)
FLAVOR="SATA SSD"
if [ -x "$TBW"] ; then
TBW="unknown"
fi
# Display drive data
echo "============ $DISK Disk Info - SSD: ============"
#echo "DRIVE_EXISTS: $DRIVE_EXISTS"
echo "Serial Number: $SERIAL"
echo "Model String: $MODEL"
echo "SMART Check: $SMART"
echo "Disk capacity: $CAPACITY"
echo "TB Written: $TBW TB"
if [ -z "$PLR" ] ; then
echo "Percent Lifetime Remaining data not available"
else
echo "$DISK has $PLR% lifetime remaining"
fi
echo
# NVMe Logic
elif [ -n "$NVME_CHECK" ] ; then
# Set Variables
MODEL=$(echo "$SMART_DATA" | grep "Model Number" | cut -d ":" -f 2 | xargs)
SERIAL=$(echo "$SMART_DATA" | grep "Serial Number" | cut -d ":" -f 2 | xargs)
TBW=$(echo "$SMART_DATA" | grep "Data Units Written" | sed 's/,//g' | \
awk -v BLOCK_SIZE="$BLOCK_SIZE" '{print $4 * BLOCK_SIZE / (2 ^ 30)}')
AVAIL_SPARE=$(echo "$SMART_DATA" | grep "Available Spare:" | cut -d ':' -f 2 | xargs)
CAPACITY=$(echo "$SMART_DATA" | grep "amespace 1 Size" | cut -d '[' -f 2 | sed 's/]//g')
SMART=$(echo "$SMART_DATA" | grep "self-assessment test result" | cut -d ":" -f 2 | xargs)
FLAVOR="NVMe"
if [ -x "$TBW"] ; then
TBW="unknown"
fi
# Display Disk Info
echo "============ $DISK Disk Info - NVMe: ============"
#echo "DRIVE_EXISTS: $DRIVE_EXISTS"
echo "Serial Number: $SERIAL"
echo "Model String: $MODEL"
echo "SMART Check: $SMART"
echo "Disk capacity: $CAPACITY"
echo "TB Written: $TBW TB"
echo "NAND spare blocks: $AVAIL_SPARE"
echo
fi
else
echo "Skipping $DISK, not SATA SSD or NVMe"
fi
done
# wait {{ sleep_time }} seconds, loop again
echo "Sleeping {{ sleep_time }} seconds"
sleep {{ sleep_time }}
done