Created
April 18, 2025 20:45
-
-
Save GregorB54321/f5721002cd2b732480a5c3f71f8f3e19 to your computer and use it in GitHub Desktop.
getting HDD's spin state
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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