Jump to content

Automatisches Herunterfahren eines Fileservers


unicorn0815

Empfohlene Beiträge

Hi zusammen,

 

Ich habe hier einen Fileserver in Betrieb, auf den verschiedene Geräte (PC, Dreamboxen und Dbox) per NFS

zugreifen. Was ich nun gern erreichen würde, ist, diesen Server automatisch nach einer Zeit X, in der keine

Zugriffe erfolgt sind, herunterfahren zu lassen.

Das Aufwecken per WOL funktioniert von allen Geräten aus ohne Probleme. Die Variante, den Server von einem

zugreifenden Gerät herunterfahren zu lassen, wenn der Zugriff beendet ist, fällt leider aus, da es durchaus

sein kann, dass mehrere Geräte gleichzeitig drauf zugreifen.

 

Das Problem, welches ich nun habe, ist: wie kann ich bei NFS-Verbindungen auf dem Server feststellen, ob eine

solche Verbindung noch aktiv ist oder nicht? Ein einfaches anpingen der Clients bringt nicht wirklich was, da

sie zum Teil permanent eingeschaltet sind, somit würde also auch der Server nie abgeschaltet.

 

Eine Möglichkeit, dir mir so eingefallen ist, wäre mit "lsof" zu schauen, ob auf die freigegebenen Dateien

zugegriffen wird. Aber entweder bin ich da komplett auf dem Holzweg, oder hab die richtigen Optionen dafür

noch nicht gefunden. Jedenfalls wird in dem Fall nichts angezeigt, selbst wenn 100%ig auf eine solche Datei

zugegriffen wird.

 

Wäre schön, wenn jemand eine Idee hätte, wie man das realisieren könnte.

 

Ach ja, auf dem Server läuft Archlinux, wobei das aber nicht wirklich eine Rolle spielen dürfte...ist ja eher

Linux allgemein...

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • Admin

Was du brauchst ist ein Script das die Netzwerkkarte checkt und wenn sich nix ändert an den Datenmengen über ein Protokoll (z.b. smb, ssh) dann den Server runterfahren lässt, so wie es VDR-Systeme auch machen, die Open Source VDR-Systeme könnten auch eine Basis für dein Script sein.

 

Vielleicht hilft dir das hier auch weiter -> Klick

 

Z.B. das hier könnte eine Basis für dich sein, führt auch einen ssh-Test durch

 

#!/bin/bash
#
# Utility script to check the user GDM session when mythshutdown --check is issued
#

# Min Idle Time. Amount of time of user idle time before ok to shut down
minidle="45min"

echo "Mythshutdown.sh Check started. Asking mythshutdown --check"

mythshutdown --check
mythstatus=$?


if [ $mythstatus -gt 0 ]
then
echo "Myth Backend says it is busy" 
exit $mythstatus
fi

echo "Myth Backend says it is not busy. Do we have any users?"

idle=`dbus-send --system \
         --dest=org.freedesktop.ConsoleKit \
         --type=method_call --print-reply  \
         --reply-timeout=20000 \
   	  /org/freedesktop/ConsoleKit/Manager \
         org.freedesktop.ConsoleKit.Manager.GetSystemIdleHint | grep -c "boolean true"`
# Alternatively do below and parse the result
idlesince=`dbus-send --system --dest=org.freedesktop.ConsoleKit  \
 --type=method_call --print-reply --reply-timeout=20000 \
        /org/freedesktop/ConsoleKit/Manager \
 org.freedesktop.ConsoleKit.Manager.GetSystemIdleSinceHint | grep string  | cut -c 23-30` 
# --->
# method return sender=:1.8 -> dest=:1.115 reply_serial=2 string "2009-02-09T21:46:29Z"

# What time was it $minidle minutes ago?
# date -d -30min -u
# -->
# ma 16.2.2009 20:45:46 +0200
sinceminidle=`date -d -$minidle -u | cut -d" " -f 3`

if [ $idle = 0 ]
then
echo "GetSystemIdleHint says not idle. We are to wait for the user."
exit 1
fi

echo "Idlesince = $idlesince. Since Min Idle = $sinceminidle"

if [ "$sinceminidle" \< "$idlesince" ]
then 
echo "System idle for less than $minidle. Still waiting."
exit 1;
fi

echo "System idle for more than $minidle. Checking ssh connections"
ssh=`ps -ef | grep sshd | grep -c @ `
if [ $ssh -gt 0 ]; then
echo "There is active $ssh sessions- not shutting down."
exit 1
fi

echo "No active ssh sessions - checking for the lock-file"

if [ -e /var/lock/mythshutdown.lock ]
then
echo "Lock file /var/lock/mythshutdown.lock exists - some maintenence operation underway?"
exit 1				
fi

echo "No lock file found"

echo "All checks done. Ok to shut down"
exit 0

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke Euch ;) mit einer Kombination aus beiden läuft es nun so wie es soll.

 

Per Cronjob wird alle 10 Minuten ein Script ausgeführt, welches die Ausgabe von

"hdparm -C ..." in ein Logfile schreibt und dann zunächst auf noch aktive SSH-Sitzungen

prüft. Sind keine mehr aktiv, wird geprüft, ob die letzten 3 Einträge im Logfile

"standby" enthalten. Ist das der Fall, wird der Rechner runtergefahren, vorher allerdings

das Logfile geleert, um sicher zu stellen, dass es mit der Zeit nicht aus allen Nähten platzt :beerhat:

 

Falls noch jemand sowas brauchen kann, hier das Script (muss als Root ausgeführt werden):

 

#!/bin/bash

SHUTDOWN="/sbin/shutdown -h now"
STATUSFILE="/var/log/hddstatus.log"
MAXCOUNT=3
HDD="/dev/sdb"

# Schreibe hdd-Status in $STATUSFILE
hdparm -C $HDD >> $STATUSFILE

# ssh-Sitzung aktiv?
ssh=`ps -ef | grep sshd | grep -c @ `
if [ $ssh -gt 0 ]; then
       exit 1 # Abbruch, wenn SSH-Sitzung vorhanden
fi

# /dev/sdb in standby für MAXCOUNT * 10 Minuten?
# dieses Script wird per Cronjob alle 10 Minuten ausgeführt
# und schreibt einen Eintrag nach $STATUSFILE
# es werden die letzten 8 Zeilen aus $STATUSFILE gelesen,
# um nur die letzten 3 Einträge zu berücksichtigen

STDBYCOUNT=`tail -n 8 $STATUSFILE | grep "standby" | wc -l`
if [ "$STDBYCOUNT" -ge "$MAXCOUNT" ]
then
       # "HDD im Standby, System herunterfahren, vorher Logfile leeren
       echo "" > $STATUSFILE
       $SHUTDOWN
else
       exit 0
fi

 

Zu beachten ist dabei allerdings, dass in meinem Fall die Festplatte, auf die die

Clients zugreifen, unabhängig von der Systemplatte ist. Ansonsten kann es sein, dass

es so nicht funktioniert, weil je nach Systemkonfiguration die Platte womöglich gar nicht

in den Standby geht, weil das System immer irgendwie drauf zugreift (syslog, oder andre

Dienste, die regelmässig irgendwelche Logfiles schreiben).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

  • Wer ist Online   0 Benutzer

    • Keine registrierten Benutzer online.
×
×
  • Neu erstellen...