Pages : 1
#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
Pages : 1