Autoshutdown von nicht benötigten Server
Autoshutdown von nicht benötigten Server
hi
ich habe bereits zum Thema autoshutown gegooglet und dazu auch einiges gefunden. darunter auch dieses schöne Script:
http://debianforum.de/forum/viewtopic.php?t=66329
Ich habe einen Debian-Server mit MySql-Datenbank. Meine Frage ist nun, wie muss ich das Script verändern, dass der Server heruntergefahren wird,
wenn kein benutzer mehr am system und der db angemeldet ist. Ich kenne die IP-Adressen der Clients nicht, deswegen kann ich das mit dem Ping nicht machen
Es würde mich freuen, wenn mir jemand sagen könnte, wie ich herausfinde, ob jemand am system oder db angemeldet ist.
ich habe bereits zum Thema autoshutown gegooglet und dazu auch einiges gefunden. darunter auch dieses schöne Script:
http://debianforum.de/forum/viewtopic.php?t=66329
Ich habe einen Debian-Server mit MySql-Datenbank. Meine Frage ist nun, wie muss ich das Script verändern, dass der Server heruntergefahren wird,
wenn kein benutzer mehr am system und der db angemeldet ist. Ich kenne die IP-Adressen der Clients nicht, deswegen kann ich das mit dem Ping nicht machen
Es würde mich freuen, wenn mir jemand sagen könnte, wie ich herausfinde, ob jemand am system oder db angemeldet ist.
-
- Beiträge: 2951
- Registriert: 24.12.2010 16:50:59
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Rheinland
Re: Autoshutdown von nicht benötigten Server
Per
könntest du prüfen, ob eine externe Verbindung zu deiner MySQL-Datenbank besteht. Mittels
koenntest du feststellen, ob jemand am System angemeldet ist. Die beiden Befehle sind keine Musterloesungen aber vielleicht Anhaltspunkte. Das fertige Skript wuerde dann so aussehen:
Code: Alles auswählen
netstat -tn | grep -v 127.0.0.1 | grep :3306 | wc -l
Code: Alles auswählen
w | grep -v "load average" | grep -v "LOGIN@" | wc -l
Code: Alles auswählen
MYSQLCONNECTIONS=$(netstat -tn | grep -v 127.0.0.1 | grep :3306 | wc -l)
USERS=$(w | grep -v "load average" | grep -v "LOGIN@" | wc -l)
if [ $MYSQLCONNECTIONS -eq 0 -a $USERS -eq 0 ];
then
shutdown -h now
fi
Re: Autoshutdown von nicht benötigten Server
Kann man nicht auf die aktiven Verbindungen schauen?Erst, wenn ueber eineinhalb Minuten keine Verbindung "established", also "vollstaendig aufgebaut" ist, wird die Schleife verlassen und poweroff ausgeloest.
Selbstverstaendlich habe ich den Code nicht ausprobiert: Ich habe einfach keine Maschine ohne Verbindungen frei...
Gruss Cae
Code: Alles auswählen
#!/bin/sh
shutdown=0;
while [ 1 != $shutdown ]; do
shutdown=1;
for fnord in $(seq 0 45); do # connection found --> cancel
netstat -tupen 2>/dev/null \
| awk '$5 !~ /(127\.0\.0\.1|::1)/' \
| grep -q ESTABLISHED \
&& shutdown=0;
sleep 2;
done
done
logger -t "$0" "no access for 90 seconds, shutting down this box"
poweroff
Selbstverstaendlich habe ich den Code nicht ausprobiert: Ich habe einfach keine Maschine ohne Verbindungen frei...
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
Re: Autoshutdown von nicht benötigten Server
Erstmal danke für die schnellen Antworten.
Tut mir leid, dass es etwas länger gedauert hat, aber habe gerade ein wenig Stress.
Ich habe das erste Script getestet und dabei ein Problem mit dem if-statement bekommen. Nach etwas suchen konnte ich es lösen , indem ich es so abgeändert habe:
Auch beim zweiten Script bekomme ich einen Syntaxfehler. Allerdings habe ich es nicht weiterverfolgt, da ich mich für das erste Skript entschieden habe. Es ist für mich nämlich leichter zu verstehen.
Ich bedankte mich für die schnelle und gute Hilfe
mfg
Tut mir leid, dass es etwas länger gedauert hat, aber habe gerade ein wenig Stress.
Ich habe das erste Script getestet und dabei ein Problem mit dem if-statement bekommen. Nach etwas suchen konnte ich es lösen , indem ich es so abgeändert habe:
Code: Alles auswählen
#!/bin/sh
MYSQLCONNECTIONS=$(netstat -tn | grep -v 127.0.0.1 | grep :3306 | wc -l)
USERS=$(w | grep -v "load average" | grep -v "LOGIN@" | wc -l)
PATH=/sbin:/bin:/usr/bin:/usr/sbin:/usr/bin/X:
if [ $MYSQLCONNECTIONS -eq 0 ] && [ $USERS -eq 0 ];
then
echo "alle clients und users offlie, server wird heruntergefahren" | logger -i -t autoshutdown.sh
shutdown -h now
fi
Ich bedankte mich für die schnelle und gute Hilfe
mfg
Re: Autoshutdown von nicht benötigten Server
Einen Syntaxfehler?! Ich hab' das jetzt extra nochmal getestet (hat natuerlich nicht getriggert) und es verhaelt sich wie erwartet. Auch kann ich aus dem Code keinen Fehler rauslesen. Wenn man es nicht als root startet, liegt poweroff nicht im $PATH, aber sonst ist da nix spezielles dran. Dein test ist vielleicht kaputt, weil's bei syssis Skript kein -a frisst. netstat, grep, awk, sleep und logger sollten auch immer da sein... Bist du sicher?marky8264 hat geschrieben:Auch beim zweiten Script bekomme ich einen Syntaxfehler.
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
Re: Autoshutdown von nicht benötigten Server
ich habe es nochmals ausprobiert und es funktioniert doch ohne Probleme. Sry habe wahrs. irgendwo eine Schreibfehler gemacht.Cae hat geschrieben: Einen Syntaxfehler?! Ich hab' das jetzt extra nochmal getestet (hat natuerlich nicht getriggert) und es verhaelt sich wie erwartet. Auch kann ich aus dem Code keinen Fehler rauslesen. Wenn man es nicht als root startet, liegt poweroff nicht im $PATH, aber sonst ist da nix spezielles dran. Dein test ist vielleicht kaputt, weil's bei syssis Skript kein -a frisst. netstat, grep, awk, sleep und logger sollten auch immer da sein... Bist du sicher?
Gruss Cae
Danke für deine Mühe und die Erklärung
mfg
Re: Autoshutdown von nicht benötigten Server
Ah, okay. Ich hab' die Version nochmal ein bisschen aufgebohrt, auf den MySQLd beschraenkt und die Login-Abfrage hinzugebaut:Die Logik zum netstat-Parsen ist jetzt komplett in awk. Zuerst wird das 4. Feld (lokale IP:Port) geprueft, ob es mit :3306 aufhoert (also ob es der MySQLd ist). Dann darf das 5. Feld (remote-IP:Port) weder IPv4- noch IPv6-localhost sein und im 6. Feld (Verbindungsstatus) muss ESTABLISHED vorkommen. Falls das alles gegeben ist, wird eine Variable e vom Default 0 auf -1 geaendert.
Nachdem alle Zeilen von netstat gelesen wurden, wird der END-Block ausgefuehrt. Falls e noch nicht veaendert wurde (und Null ist), wird mit 1 als Rueckgabewert beendet, das && von der Shell triggert nicht, die Shell-Variable $shutdown bleibt auf 1. Andernfalls wird mit 0 beendet und $shutdown auf 0 gesetzt.
Schliesslich wird noch die Laenge des Outputs von w -h (-h == keine Header, nur "Login-Zeilen") geprueft. Wenn sie nicht Null (-n) ist, wird jemand eingeloggt sein und $shutdown wird ebenfalls auf 0 gesetzt.
Gruss Cae
Code: Alles auswählen
#!/bin/sh
shutdown=0;
while [ 1 != $shutdown ]; do
shutdown=1;
for fnord in $(seq 0 45); do # connection found --> cancel
netstat -tupen 2>/dev/null \
| awk ' \
$4 ~ /:3306$/ && \
$5 !~ /(127\.0\.0\.1|::1)/ && \
$6 ~ /ESTABLISHED/ \
{ e = -1 }
END { exit e + 1 }' \
&& shutdown=0; # active connection(s)
[ -n "$(w -h)" ] && shutdown=0; # someone's logged in
sleep 2;
done
done
logger -t "$0" "no access for 90 seconds, shutting down this box"
poweroff
Nachdem alle Zeilen von netstat gelesen wurden, wird der END-Block ausgefuehrt. Falls e noch nicht veaendert wurde (und Null ist), wird mit 1 als Rueckgabewert beendet, das && von der Shell triggert nicht, die Shell-Variable $shutdown bleibt auf 1. Andernfalls wird mit 0 beendet und $shutdown auf 0 gesetzt.
Schliesslich wird noch die Laenge des Outputs von w -h (-h == keine Header, nur "Login-Zeilen") geprueft. Wenn sie nicht Null (-n) ist, wird jemand eingeloggt sein und $shutdown wird ebenfalls auf 0 gesetzt.
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
Re: Autoshutdown von nicht benötigten Server
danke für die erklärung
aber ich habe gerade feststellen müssen, das der vorgeschlagene Weg nicht funktioniert.
Nach einiger Zeit verschwindet nämlich der Eintrag für die mysql-Verbindung aus netstat.
Obwohl das Programm noch immer jederzeit auf die DB zugreifen kann.
Was kann ich den dagegen machen?
mfg
aber ich habe gerade feststellen müssen, das der vorgeschlagene Weg nicht funktioniert.
Nach einiger Zeit verschwindet nämlich der Eintrag für die mysql-Verbindung aus netstat.
Obwohl das Programm noch immer jederzeit auf die DB zugreifen kann.
Was kann ich den dagegen machen?
mfg
Re: Autoshutdown von nicht benötigten Server
Nochmal zur Suchmaschinenoptimierung, weil ich selbst gerade nach diesem Thread gesucht hatte (und "lsof shutdown" bisher nicht matchte): lsof -i zeigt aehnlich wie netstat offene Verbindungen an. Ich wiederhole: lsof -i.
Gruss Cae
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier