Hi,
ich würde meine USB-Festplatten gerne schlafen legen lassen, sofern nach einer gewissen Zeit keine Zugriffe stattgefunden haben. Ich habe auch schon ein Scripte gefunden, aber manchmal scheint es so, als würde es nicht auf anhieb funktionieren. Ich höre zwar, dass die HDD etwas macht, aber dann passiert nichts.
Momentan verwende ich folgendes Script, das per Cronjob alle 10 Minuten meine USB-Festplatten auf Inaktivität überprüft:
[expander]
Bash
#!/bin/bash
# Author: Mace Moneta
# Description: Spin down the drive when it goes idle
PARAM=$1
OPTION=${PARAM%%=*}
VALUE=${PARAM##*=}
LOCK_FILE="/dev/shm/idle-drive-${VALUE}.lock"
STATE_FILE="/dev/shm/idle-drive-${VALUE}.state"
DOWN_FILE="/dev/shm/idle-drive-${VALUE}.down"
FIX="/dev/shm/idle-drive.fixed"
idle_drive_log() {
local PREFIX="idle-drive.info"
local PREFIXLEN=${#PREFIX}
local PREFIXLEN=$((10#$PREFIXLEN+2))
local MSG=$1
local MSGLEN=${#MSG}
local MSGLEN=$((10#$MSGLEN+$PREFIXLEN))
logger -s -t $PREFIX "$MSG"
}
idle_drive_cleanup() {
rm -f $LOCK_FILE
idle_drive_log "Exiting on interrupt."
exit
}
trap idle_drive_cleanup INT
trap idle_drive_cleanup HUP
trap idle_drive_cleanup QUIT
trap idle_drive_cleanup USR1
trap idle_drive_cleanup TERM
DRIVE=`ls -l --full-time /dev/disk/by-label/ | grep "$VALUE" | awk '{print $11}' | sed s_\.\.\/\.\.\/__`
DRIVE=${DRIVE##*/}
DISK=${DRIVE:0:3}
DRIVE="/dev/${DISK:0:3}"
echo $DRIVE
echo $DISK
if [ "$DISK" == "" ]; then
idle_drive_log 'Disk not found.'
exit 1
fi
if [ -f $LOCK_FILE ]; then
idle_drive_log "Already in progress for $DRIVE ($VALUE)."
exit 1
fi
touch $LOCK_FILE
# Check I/O stats to see if the drive has been idle
STATE=`grep " $DISK " /proc/diskstats`
if [ -f $STATE_FILE ]; then
STATE_PREVIOUS=`/bin/cat $STATE_FILE`
else
idle_drive_log "Initializing state for $DRIVE ($VALUE)."
echo "$STATE" > $STATE_FILE
rm -f $LOCK_FILE
exit 0
fi
# If the I/O stats haven't changed, the drive is idle
if [ "$STATE" == "$STATE_PREVIOUS" ] && [ ! -f $DOWN_FILE ]; then
idle_drive_log "Disk state unchanged and disk spinning. Spin down drive $DRIVE ($VALUE)"
sync
sdparm --flexible --command=sync $DRIVE &>/dev/null
sdparm --flexible --command=stop $DRIVE &>/dev/null
[ ! -f $FIX ] && sleep 5 && touch $FIX && sdparm --flexible --command=stop $DRIVE &>/dev/null
STATE=`grep " $DISK " /proc/diskstats`
echo "$STATE" > $STATE_FILE
touch $DOWN_FILE
else
if [ "$STATE" != "$STATE_PREVIOUS" ]; then
idle_drive_log "Disk state changed. Deleting $DOWN_FILE and refreshing state."
rm -f $DOWN_FILE
echo "$STATE" > $STATE_FILE
fi
fi
# Done
rm -f $LOCK_FILE
exit 0
Alles anzeigen
[/expander]
Vielleicht kennt ihr ja eine bessere Lösung die zuverlässig funktioniert?