Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/11/2010, à 19:05

s-prit

[TUTO] Mise en veille HDD USB

En fouillant sur le net, je ne suis pas arrivé à trouver un moyen simple pour mettre mes HDD connectés en USB en veille au bout d'un certain temps.
Je vous propose le script suivant que l'on lance en tache de fond et qui fait ça pour nous.
Pour que ça fonctionne il faut que le package sdparm soit installé.

La ligne de commande pour le lancer :

sudo ./HDDspindown.sh sdx 600 &

Le premier paramètre est le nom du disque (sda, sdb, sdc, etc.)
Le deuxième paramètre est le timeout en seconde.

Voici le script HDDspindown.sh :

#!/bin/bash


# INIT #
disk=$1
timeOut=$2

lastDiskStatus=""
diskStatus=""

activityTimeStamp=0

loopStandBy=5

logFile=./logs/HDDspindown.log
# INIT #


# MAIN LOOP #
echo "$(date '+%Y-%m-%d %H:%M:%S') | $disk | Script launched with timeout of $timeOut s" >> $logFile

while true
do
        # LOOP STAND BY #
        sleep $loopStandBy
        # LOOP STAND BY #


        # CHECK IF DISK EXISTS #
        if [ ! -e /dev/$disk ]; then
                #echo "$disk don't exist"
                continue
        fi
        # CHECK IF DISK EXISTS #
        # GET DISK STATUS #
        lastDiskStatus=$diskStatus
        diskStatus=$(grep " $disk " /proc/diskstats)
        # GET DISK STATUS #


        # CHECK DISK ACTIVITY #
        if [ "$diskStatus" != "$lastDiskStatus" ]; then
                #echo "Activity detected on $disk"

                lastActivityTimeStamp=$(date +%s)
                continue
        fi
        # CHECK DISK ACTIVITY #

        #echo "Inactivity detected on $disk"

        # COMPUTE TIMESTAMP UNTIL THE LAST ACTIVITY #
        ((timeStamp=$(date +%s)-lastActivityTimeStamp))
        # COMPUTE TIMESTAMP UNTIL THE LAST ACTIVITY #


        # CHECK INACTIVITY TIMEOUT #
        if [ $timeStamp -lt $timeOut ]
        then
                #echo "Inactivity delay is $timeStamp s ( < $timeOut)"
                continue
        fi
        # CHECK INACTIVITY TIMEOUT #

       # SPINDOWN DISK #
        #echo "Spindown disk"
        echo "$(date '+%Y-%m-%d %H:%M:%S') | $disk | Spindown" >> $logFile
        #sdparm --command=stop /dev/$disk
        sdparm -qC stop /dev/$disk
        # SPINDOWN DISK #


        # WAIT NEW ACTIVITY #
        while [ "$diskStatus" = "$lastDiskStatus" ]
        do
                sleep $loopStandBy

                # GET DISK STATUS #
                lastDiskStatus=$diskStatus
                diskStatus=$(grep " $disk " /proc/diskstats)
                # GET DISK STATUS #
        done
        # WAIT NEW ACTIVITY #

        #echo "New activity detected on $disk"
        echo "$(date '+%Y-%m-%d %H:%M:%S') | $disk | New activity detected" >> $logFile


        # RESET #
        lastDiskStatus=""
        diskStatus=""

        activityTimeStamp=0
        # RESET #
done
# MAIN LOOP #

Hors ligne

#2 Le 09/10/2014, à 10:55

fnutthedog

Re : [TUTO] Mise en veille HDD USB

Hello et merci pour ce script. C'est exactement ce que je cherchais.

J'ai cependant un petit problème. Je me pose la question du "loopstandby" dans le script.
Lorsque j’exécute le script, mon DD ne se met pas en veille au bout de 600 secondes mais au bout de 5, valeur donnée au loopstandby. J'ai essayé de mettre 10 s au loopstandby et il se met en veille au bout de 10s et toujours pas 600.

Par contre, si je choisi une valeur de 300 pour le loopstandby, mon DD se met en veille au bout de 600 s. J'ai du mal à saisir la nuance.
Il doit y avoir une subtilité dans le script qui m'échappe...

NB : pour lancer le script je dois plutôt utiliser la commande : sudo sh HDDstandby.sh sdd1 600 &
A quoi sert le & ?

D'avance merci

Hors ligne

#3 Le 09/11/2014, à 19:37

fnutthedog

Re : [TUTO] Mise en veille HDD USB

Finalement après plusieurs heures passées sur ce script prometteur, j'ai trouvé pourquoi cela ne fonctionnait pas. Il y a deux erreurs dans le script. tout d'abord, la ligne :

((timeStamp=$(date +%s)-lastActivityTimeStamp))

doit être remplacée par :

timeStamp=$(((date +%s)-lastActivityTimeStamp))


ensuite  la ligne :

if [ $timeStamp -lt $timeOut ]

par :

if [ "$timeStamp" -lt "$timeOut" ]

Enfin, je me pose la question de l'utilité de déclarer la variable activityTimeStamp qui n'est jamais utilisée dans le script.
Je l'ai remplacée par lastActivityTimeStamp sans aucune certitude.
En tout cas ça fonctionne maintenant.

Hors ligne