Skip to content

Instantly share code, notes, and snippets.

@GregorB54321
Created April 18, 2025 20:45
Show Gist options
  • Save GregorB54321/f5721002cd2b732480a5c3f71f8f3e19 to your computer and use it in GitHub Desktop.
Save GregorB54321/f5721002cd2b732480a5c3f71f8f3e19 to your computer and use it in GitHub Desktop.
getting HDD's spin state
#!/usr/bin/bash
DRIVE_ID[0]=/dev/disk/by-id/wwn-0x50014ee2ae42a608 # 2TB Disk model: WDC WD20EADS-00S
DRIVE_ID[1]=/dev/disk/by-id/wwn-0x50014ee20a7836a8 # 4TB Disk model: WDC WD40EZRX-00S
DRIVE_ID[2]=/dev/disk/by-id/wwn-0x5000c500b1841369 # 8TB Disk model: ST8000NM0055-1RM
DRIVE_ID[3]=/dev/disk/by-id/wwn-0x5000c500b1844fe1 # 8TB Disk model: ST8000NM0055-1RM
DRIVE_ID[4]=/dev/disk/by-id/wwn-0x5000c500b185901f # 8TB Disk model: ST8000NM0055-1RM
for DRIVE_NUM in "${!DRIVE_ID[@]}"; do # init some variables
DRIVE_STATE_OLD[$DRIVE_NUM]=""
DRIVE_STATE_TIME_CHANGED_OLD[$DRIVE_NUM]=$(( $(date +%s) - 10 ))
DRIVE_STATE_TIME_CHANGED[$DRIVE_NUM]=$(date +%s)
# echo "DRIVE_ID[$DRIVE_NUM] = ${DRIVE_ID[$DRIVE_NUM]}"
done
YELLO=$(echo -e "\e[1;33m")
GREEN=$(echo -e "\e[32m")
RED=$(echo -e "\e[31m")
NOCOL=$(echo -e "\e[0m")
echo "$(date '+%Y.%m.%d %H:%M:%S') started..."
while (true)
do
DRIVES_CNT_STOPPED=0
for DRIVE_NUM in "${!DRIVE_ID[@]}"; do
DRIVE_STATE_DURATION[$DRIVE_NUM]=" "
DRIVE_STATE[$DRIVE_NUM]=$( smartctl -i -n sleep ${DRIVE_ID[$DRIVE_NUM]} | grep 'Power'|cut -d: -f2|sed -e 's/^ *//g' -e 's/ /_/g' -e 's/ACTIVE_or_IDLE/Spin/g' -e 's/IDLE_A/Spin/g' -e 's/IDLE_B/Spin/g' -e 's/STANDBY/Stop/g' )
if [[ ${DRIVE_STATE[$DRIVE_NUM]} == "Stop" ]]; then
DRIVES_CNT_STOPPED=$(( $DRIVES_CNT_STOPPED + 1 )) # count number of stopped drives for statistics
fi
case ${DRIVE_STATE[$DRIVE_NUM]} in # colorize drive state
Spin)
DRIVE_STATE_COLORED[$DRIVE_NUM]=$(echo "${YELLO}${DRIVE_STATE[$DRIVE_NUM]}${NOCOL}")
;;
Stop)
DRIVE_STATE_COLORED[$DRIVE_NUM]=$(echo "${GREEN}${DRIVE_STATE[$DRIVE_NUM]}${NOCOL}")
;;
*)
DRIVE_STATE_COLORED[$DRIVE_NUM]=${DRIVE_STATE[$DRIVE_NUM]}
;;
esac
if [[ ${DRIVE_STATE_OLD[$DRIVE_NUM]} != ${DRIVE_STATE[$DRIVE_NUM]} ]] ; then # if that drive's state changed:
state_change=1 # initiate print out after iteration
DRIVE_STATE_TIME_CHANGED[$DRIVE_NUM]=$(date +%s) # get change time
DRIVE_STATE_DURATION[$DRIVE_NUM]=$(printf "%5s" "$(( (${DRIVE_STATE_TIME_CHANGED[$DRIVE_NUM]} - ${DRIVE_STATE_TIME_CHANGED_OLD[$DRIVE_NUM]}) / 60 ))") # calculate duration since last change
if [[ ${DRIVE_STATE_OLD[$DRIVE_NUM]} == "Spin" ]]; then # colorize duration according to last state
DRIVE_RESULT[$DRIVE_NUM]=$(echo -n "${DRIVE_STATE_COLORED[$DRIVE_NUM]}${YELLO}${DRIVE_STATE_DURATION[$DRIVE_NUM]}${NOCOL}")
else
DRIVE_RESULT[$DRIVE_NUM]=$(echo -n "${DRIVE_STATE_COLORED[$DRIVE_NUM]}${GREEN}${DRIVE_STATE_DURATION[$DRIVE_NUM]}${NOCOL}")
fi
DRIVE_STATE_TIME_CHANGED_OLD[$DRIVE_NUM]=${DRIVE_STATE_TIME_CHANGED[$DRIVE_NUM]} # last change = now
DRIVE_STATE_OLD[$DRIVE_NUM]=${DRIVE_STATE[$DRIVE_NUM]} # last state = actual
else
DRIVE_STATE_DURATION[$DRIVE_NUM]=" "
DRIVE_RESULT[$DRIVE_NUM]=$(echo -n "${DRIVE_STATE_COLORED[$DRIVE_NUM]}${DRIVE_STATE_DURATION[$DRIVE_NUM]}") # add colored state to print out
fi
done
if [[ $state_change -eq 1 ]]; then # print out now?
state_change=0
echo -n "$(date '+%Y.%m.%d %H:%M:%S') "
for DRIVE_NUM in "${!DRIVE_ID[@]}"; do
echo -n "${DRIVE_RESULT[$DRIVE_NUM]} - "
done
if [[ $DRIVES_CNT_STOPPED -eq ${#DRIVE_ID[@]} ]]; then
echo -n " ${RED}YIPPIE YEAH! All stopped!${NOCOL}"
fi
echo
fi
sleep 1
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment