Herunterfahren eines Servers über Script und CRON Job

Halloo zusammen,

nachdem mein Server nun doch ein Serverbetriebssystem bekommen hat, muss ich lernen mit dem installierten UBUNTU (14.10 Utopic Unicorn) auszukommen. Nach dem UBi und ich uns etwas angefreundet haben nun noch ein Problem. Um Energie zu sparen soll der Server per WOL starten (klappt) und wenn ihn keiner mehr braucht soll er ausgehen. Dazu habe ich mir aus einer Vorlage ein Script geschrieben, das prüft ob einer der beiden in Frage kommenden Clients noch an ist. (siehe unten) Aber nun muss ich das Script ja in regelmäßigen Abständen starten und ggfs. halt den Server runterfahren. Dazu nun drei Fragen:

Ich wollte einen CRON Job verwenden, der regelmäßig (hier als Test jede Minute) das Script anstösst. Dazu habe ich folgende Zeile verwendet:
*/1 * * * *  root //home/autoshutdown.sh
Der Pfad stimmt. Ist der Aufruf so korrekt?
Kann da was an Rechten scheitern?

Außerdem: CRON Jobs kann man ja für alle oder bestimmte User einrichten. Damit der CRON Job immer läuft habe ich diesen über:

sudo crontab -e

eintragen. So ok oder anders eintragen?

Ich hoffe, das war so verständlich und freue mich auf eure Antworten!

fg

Dirk.P

Script:

#!/bin/sh

# Filename of the statusfile
STATUSFILE="/home/autoshutdown.log"

# which ip range should be checked?
# this example looks in "192.168.1.10 to 192.168.1.30"
# and "192.168.178.10 to 192.168.178.30"
RANGE="192.168.178.41 192.168.178.69"

# how many clients are always on (other servers, routers, etc)
MINCLIENTS=0

# shutdown after how many retries?
RETRIES=2

NUMCLIENTS=`nmap -sP $RANGE -oG - | grep "^Host" | wc -l`

echo "NC=$NUMCLIENTS"

echo "`date +%Y-%m-%d-%H-%M`" \> checkActiv

if [$NUMCLIENTS -le $MINCLIENTS]; then

 if [! -f "$STATUSFILE"]; then
 echo 0 \> $STATUSFILE
 else
 read COUNT $STATUSFILE
 #echo "count new set: $COUNT"
 fi;
 fi;

else

 if [-f "$STATUSFILE"]; then
 rm $STATUSFILE
 fi

fi

Ahoi Dirk,

CRON Jobs kann man ja für alle oder bestimmte User einrichten.

Soweit ich weiß gibt’s keine „globalen“ Cron-Jobs.

*/1 * * * * root //home/autoshutdown.sh
Ist der Aufruf so korrekt?

Wenn das Script jede Minute starten soll, müsste die Zeile eigentlich

\* \* \* \* \* /home/autoshutdown.sh

lauten.

sudo crontab -e

Damit läuft der Cron-Job als root, sollte also keine Probleme mit Zugriffsberechtigungen, etc. geben.

P.S.: Weitere Informationen zu Cron: http://de.wikipedia.org/wiki/Cron

Hallo,

*/1 * * * *  root //home/autoshutdown.sh

Jede Minute ist * * * * *
Die Frage ist, wo Du die Zeile hingetan hast.

sudo crontab -e

eintragen. So ok oder anders eintragen?

Dann wird das Script mit root-Rechten ausgeführt. Die Syntax ist dann aber falsch, das wort „root“ ist in dem Eintrag zuviel. Richtig wäre das in einer der globalen crontabs, die aber nicht mit dem befehl „crontab“ bearbeitet werden …

Sebastian

Hallo Isendrak,

habe mir deinen Hinweis zu Herzen genommen und den Artikel nochmals und noch intensiver gelesen. Dabei ist mir klar geworden, dass der Cronjob quasi „aus dem cron Verzeichnis“ aufgerufen wird (oder habe ich es noch nicht verstanden?). Dann passen meine Pfade in dem Script nicht… Also geändert. Außerdem rufe ich nun mein Script mit:
sudo //home/autoshutdowb.sh
auf. Auch hier „globaler“ Pfad und root Rechte für den Aufruf.

Den Eintrag für die Minuten auch geändert.

Tatsächlich kann man „System Cron Jobs“ einrichten. Aber: Im Moment habe ich mindestens an drei Stellen die Zeile für den Job hingeschrieben.

Gute Nachricht: Es klappt! Aber ich werde nun noch testen, wo denn die Zeile wirklich hingehört, Lernt und macht die Pflege dann doch einfacher!
(Werde auch mal testen, was Pfade und root Rechte im Aufruf oder Pfade im Script ausmachen, damit ich verstehe was wirklich notwendig gewesen wäre.

Danke für den Tipp!

fg

Dirk.P

Moin,

Gute Nachricht: Es klappt! Aber ich werde nun noch testen, wo
denn die Zeile wirklich hingehört, Lernt und macht die Pflege
dann doch einfacher!

hast du eigentlich vorgesehen, dass es nicht zu viele reboots in zu kurzer Zeit gibt? Insbesondere Festplatte mögen das vielleicht nicht.

VG
J~

Hallo J~,

ich hoffe, dass wird nicht passieren. Den Cron Job (muss mir mal eine einheitliche Schreibweise angewöhnen) soll eigentlich nur alle 5 oder 10 Minuten laufen. Die 1 Minute war zum Testen.

In der Praxis würden die Platten laufen, bis beide Clients keinen Bedarf mehr haben, also „aus“ sind (Daher „testen“ für das Ausschalten über IP der Clients).

Der eine Client ist ein Raspberry, über den Musik, Videos, Fotos zur Verfügung gestellt werden sollen. Also eher lange und dann ist auch wieder lange Schluss.

Der andere Client ist mein Laptop, der „irgendwelche“ Daten braucht. Also auch eher an, dann aus.

Beide also nicht ständig an/aus. Und der Laptop kommt eh erst nach einem WOL an die Daten. Mit dem Raspberry muss ich mal schauen, wahrscheinlich automatisch ein WOL zum Server, sofern es keine On Demand Lösung über die XBMC Oberfläche gibt.

Gefühlt: Einmal am Tag anmachen, dann ein paar Stunden laufen lassen. Das sollte doch im Rahmen sein, oder? Im Moment auch noch als Luxus mit Raid 5 sind 7 Platten im Verbund. (Ja, kostet viel Strom…)

Werde mal sehen wie das klappt oder ob doch eine „nackte“ NAS her muss…

fg

Dirk.P

Hallo Sebastian,

hatte unten schon was kommentiert.

Mal unterstellt ich hätte es verstanden:

sudo nano //etc/crontab
sudo crontab -e
crontab -e

liefern mir Zugriff auf drei Dateien.

Die erste (//etc/crontab) erwartet auch einen User je Job. Diese Datei ist für mich „System“.

Die anderen beiden erwarten keinen User, sollten also beide am angemeldeten User hängen. (Warum es da zwei gibt?) crontab -l und sudo crontab -l sind auch unterschiedlich, passend zu den beiden Dateien.

Nun denn. Erstmal bleibt das ein Rätsel.

Ich habe jetzt über über

sudo nano //etc/crontab

einen Job mit User root eingetragen, der dann mein Script anstößt. Nun gehe ich mal davon aus, dass der auch ohne User läuft. Werde mal sehen…

fg

Dirk.P

Hallo,

Mal unterstellt ich hätte es verstanden:

sudo nano //etc/crontab
sudo crontab -e
crontab -e

liefern mir Zugriff auf drei Dateien.

Ja.

Die erste (//etc/crontab) erwartet auch einen User je Job.

Ja.

Diese Datei ist für mich „System“.

Okay.

Die anderen beiden erwarten keinen User, sollten also beide am
angemeldeten User hängen. (Warum es da zwei gibt?) crontab -l
und sudo crontab -l sind auch unterschiedlich, passend zu den
beiden Dateien.

Ja.

sudo nano //etc/crontab

einen Job mit User root eingetragen, der dann mein Script
anstößt. Nun gehe ich mal davon aus, dass der auch ohne User
läuft. Werde mal sehen…

Was meinst Du mit „ich [gehe] mal davon aus, dass der auch ohne User läuft“. ?

Der wird mit root-Rechten laufen.

HTH,

Sebastian

Hallo Sebastian,

vielen Dank für die Antworten. Scheint bei mir langsam zu klappen.

„ohne User läuft“: Was ich meinte ist, dass kein User angemeldet sein muss. Oder werden die Cron Jobs eines Users auch ausgeführt, wenn er nicht angemeldet ist? Wäre hier praktisch, wäre aber auch irgendwie komisch.

fg

Dirk.P

Hallo,

„ohne User läuft“: Was ich meinte ist, dass kein User
angemeldet sein muss. Oder werden die Cron Jobs eines Users
auch ausgeführt, wenn er nicht angemeldet ist?

Ja, so ist es.

Wäre hier
praktisch, wäre aber auch irgendwie komisch.

Nein, das ist „normal“. Wäre dioch noch schöner, wen automatische Dinge es erfordertern, dass jemand daneben sitzt und Händchen hält …

Sebastian

Hallo Sebastian,

Wäre hier
praktisch, wäre aber auch irgendwie komisch.

Nein, das ist „normal“. Wäre dioch noch schöner, wen
automatische Dinge es erfordertern, dass jemand daneben sitzt
und Händchen hält …

Dann werde ich die Jobs an meinen User hängen. Klingt plausibel und ist „gefühlt“ einfacher, da sich „per se“ die Frage nach Rechten nicht stellt. Da dieser Job nur dann läuft, wenn „eh keiner da“ ist, kann das auch allen egal sein. (Bis auf weiteres bin ich eh der einzige User…)

fg

Dirk.P