WakeOnLan/Shell Script - Best Practice

Osiris1

Lt. Junior Grade
Registriert
Feb. 2008
Beiträge
351
Hi

Ich würde gerne über mein RaspberryPi mein NAS von Remote aufwecken damit ich dessen FTP Server benutzen kann.

Derzeit mache ich das so:
Ich fürchte via ssh ein Shell Script aus das alle 5 sek einen Wake Up Call an das NAS schickt. Entfällt der Wake Up Call schaltet sich das NAS nach ca einer Minute ab.

Das ist jetzt allerdings etwas umständlich weil ich immer manuell das ssh script ausführen und auch wieder beenden muss (vom Handy). Deswegen würde ich gerne ein Android App schreiben, dass das automatisch macht. Das starten des scripts ist kein Problem denke ich: nohup und & führen dazu, dass das script im hintergrund läuft selbst wenn die ssh session beendet wird. Aaaaber wie beende ich das script jetzt wieder? Die Prozess Id ist ja jedes mal eine andere... Vorschläge?

Alternativ könne ich auch einen cron Job aktivieren und deaktivieren der alle 60 sek ausgeführt wird und dann eine Minute lang alle 5 Sekunden das NAS aufweckt. Der Nachteil ist aber, dass sowohl der Aufweck als auch Herunterfahrprozess dabei im schlimmsten Fall eine Minute länger dauert.

Wie würdet ihr das machen?
 
Zuletzt bearbeitet:
Der killall Befehl kann alle Prozesse eines bestimmten Nutzers killen. :) Wenn jetzt ein Nutzer nur das stay-alive-script ausführt, dann sollte deine Überlegung damit doch klappen?

Bist du im Netzwerk oder unterwegs? Für das Netzwerk gibt es ganz normale wake-on-lan Apps.
Aber das mit dem Runterfahren hast du schon clever gelöst.
 
Zuletzt bearbeitet:
Naja ich würds gerne von außen steuern. Also über Portforwarding. Das funktioniert ja auch soweit.

Derzeit lasse ich das script vom pi user laufen. Ich könnte aber einen eigenen Benutzer dafür anlegen und dann mit kill all alle Prozesse killen... Kann das Nebenwirkungen haben?

PS: das script verwendet "wakeonlan" mit der mac adresse als parameter. der befehl wird mittels broadcast an das ganze netzwerk geschickt und die richtige mac adresse hört drauf.
 
Osiris1 schrieb:
nohup und & führen dazu, dass das script im hintergrund läuft selbst wenn die ssh session beendet wird. Aaaaber wie beende ich das script jetzt wieder?

Code:
lsof | grep "${scriptname}" | awk '{ print $2 }' | uniq
gibt Dir die PID, wenn das Script noch aktiv ist.
Code:
kill -9 $(lsof | grep "${scriptname}" | awk '{ print $2 }' | uniq)
killt Dir das script, wenn es noch aktiv ist. Der Benutzer muß nur der gleiche sein oder die Parameter für lsof müssen geändert werden. Ist eine quick'n'dirty Lösung.

Hast Du auf dem pi eigentlich einen Webserver laufen? Dann könntest Du das Problem recht bequem per PHP als point-and-click-Variante lösen...
 
He Danke. Sowas in die Richtung hab ich gesucht.

Nein ich hab keinen Webserver laufen, da mir der tendenziell zu langsam ist. Wäre aber sicher auch eine Variante.
Ergänzung ()

hm.... ich bin mir grad mit den variablen nicht sicher.... so in etwa?

Code:
kill -9 $(lsof | grep wakeup.sh | awk | uniq)

was ist mit '{ print $2 }'?

Code:
lsof | grep wakeup.sh | awk | uniq
selbst gibt mir genau garnichts zurück...
Ergänzung ()

So... habs jetzt so gemacht:

1. Neuen User erstellt
2. Mit dem neuen User: sh wakeup.sh &
3. Mit dem neuen User: killall sh wakeup.sh

Das funktioniert. Allerdings beschwert sich die Shell, dass wakeup.sh nicht gefunden wurde. Wenn ich killall 'sh wakeup.sh' tippe wirds auch nicht gefunden... Ich verstehe zwar nicht ganz was da passiert, aber es funktioniert zumindest.
Ergänzung ()

killall sh
killt sh wakeup.sh ohne Fehler... Wenn ich den User nur für dieses Script benutze sollte das zu keinen Fehlern führen... Eigentlich...
Ergänzung ()

Das App funktioniert jetzt übrigens einwandfrei. Danke euch beiden. Der Thread kann geschlossen werden.
 
Zuletzt bearbeitet:
Osiris1 schrieb:
was ist mit '{ print $2 }'?

'lsof' gibt Dir etwas zurück, was in etwa so aussieht (Ausschnitt einer einzelnen Zeile):
Code:
iceweasel 16234         twostone  txt       REG                8,1    95008 7344386 /usr/lib/iceweasel/iceweasel
Interessant ist aus diesem Array allerdings nur die jeweils zweite Spalte, die die PID bezeichnet. Genau das kann man erreichen, wenn man die Zeile nochmals mit awk '{ print $2 }' bearbeitet. Ein anschließendes uniq sorgt dafür, daß die PID nur einmal weitergegeben wird an das neue Array, das letztlich nach stdout ausgegeben wird.
 
Ah Danke. Sowas ähnliches hab ich schon vermutet.
 
Warum fährt denn dein NAS nach einer Minute runter, sobald das WOL-Signal aufhört? Sollte das NAS nicht erst runterfahren, wenn kein Zugriff mehr erfolgt?
 
Es erfolgt ja kein Zugriff mehr. Ich denke wenn konstant Zugriffe erfolgen wird sich das NAS auch nicht ausschalten. Aber ich habs ehrlich gesagt nicht probiert. Und wenn ich es nicht konstant auch ohne Zugriff am Leben erhalten, dürfte ich beim FTP Transfer maximal ganz kurze Pausen einlegen....
 
Wie bringst Du es überhaupt dazu, daß es auf konstante WOL-Packete reagiert?
 
Das liegt an der Firmware des NAS selber. Ich denke die mitgelieferte Software für Windows tut etwas ähnliches. Daran habe ich nichts gedreht. Wer weiß... vielleicht gibt es sogar ein eigenes Signal "Go Sleep". Ich weiß nur nichts davon, und wüsste auch nicht wie ich das herausfinden soll.

Grundsätzlich ist die Firmware des NAS auch nur Linux...
 
Zurück
Oben