Autoshutdown von nicht benötigten Server

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
marky8264
Beiträge: 4
Registriert: 23.01.2013 17:45:18

Autoshutdown von nicht benötigten Server

Beitrag von marky8264 » 23.01.2013 17:57:41

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.

syssi
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

Beitrag von syssi » 23.01.2013 18:05:23

Per

Code: Alles auswählen

netstat -tn | grep -v 127.0.0.1 | grep :3306 | wc -l
könntest du prüfen, ob eine externe Verbindung zu deiner MySQL-Datenbank besteht. Mittels

Code: Alles auswählen

w | grep -v "load average" | grep -v "LOGIN@" | wc -l
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

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

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Autoshutdown von nicht benötigten Server

Beitrag von Cae » 23.01.2013 18:46:24

Kann man nicht auf die aktiven Verbindungen schauen?

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
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
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

marky8264
Beiträge: 4
Registriert: 23.01.2013 17:45:18

Re: Autoshutdown von nicht benötigten Server

Beitrag von marky8264 » 24.01.2013 23:28:42

Erstmal danke für die schnellen Antworten. :wink:

Tut mir leid, dass es etwas länger gedauert hat, aber habe gerade ein wenig Stress. :cry:
Ich habe das erste Script getestet und dabei ein Problem mit dem if-statement bekommen. Nach etwas suchen konnte ich es lösen :D , 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
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 :THX:
mfg

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Autoshutdown von nicht benötigten Server

Beitrag von Cae » 25.01.2013 00:12:30

marky8264 hat geschrieben:Auch beim zweiten Script bekomme ich einen Syntaxfehler.
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
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

marky8264
Beiträge: 4
Registriert: 23.01.2013 17:45:18

Re: Autoshutdown von nicht benötigten Server

Beitrag von marky8264 » 25.01.2013 11:43:26

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
ich habe es nochmals ausprobiert und es funktioniert doch ohne Probleme. Sry habe wahrs. irgendwo eine Schreibfehler gemacht.
Danke für deine Mühe und die Erklärung :THX:
mfg

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Autoshutdown von nicht benötigten Server

Beitrag von Cae » 25.01.2013 12:16:57

Ah, okay. Ich hab' die Version nochmal ein bisschen aufgebohrt, auf den MySQLd beschraenkt und die Login-Abfrage hinzugebaut:

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
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
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

marky8264
Beiträge: 4
Registriert: 23.01.2013 17:45:18

Re: Autoshutdown von nicht benötigten Server

Beitrag von marky8264 » 27.01.2013 21:19:49

danke für die erklärung :wink:

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. :cry:
Obwohl das Programm noch immer jederzeit auf die DB zugreifen kann.
Was kann ich den dagegen machen?

mfg

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Autoshutdown von nicht benötigten Server

Beitrag von Cae » 15.07.2013 13:55:24

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
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

Antworten