Icke275
Anmeldungsdatum: 31. Dezember 2012
Beiträge: 130
|
Moin, ich habe aus "Althardware" als Übungsprojekt einen Server zusammengebaut und aufgesetzt, den die Kinder jetzt im Heimnetz als Minecraftserver nutzen. Start per Wake-on-Lan oder Knopfdruck, der Minecraftserver (Java) wird per SSH gestartet. Nur das mit dem Stoppen und Herunterfahren klappt noch nicht so wirklich und wird gerne mal vergessen, wenn man denn irgendwann mal schlafen geht 😎. Für den Minecraftserver schreibt der älteste jetzt ein Java-Script, das den automatisch stoppt, wenn seit ca. 10 Minuten keiner mehr spielt. Für den Server selbst suche ich jetzt nach einer Möglichkeit, den kurz danach auch selbstständig runterzufahren. Ich fand bisher folgendes:
program-fuer-automatisches-ausschalten-nach-6 → Ähnliche Fragestellung, uralt, als ungelöst markiert. Archiv/Skripte/Auto SUSPEND → Archiviert, macht aber (etwa) was ich will: Da der Minecraft-Serversteuerer über SSH eingeloggt sein wird, ist "kein SSH" ein guter Indikator. Noch eleganter wäre, wenn auch noch geprüft würde, ob Java noch läuft. Und da rc.local obsolet ist, müsste es über eine Service Unit gestartet werden. Skripte/Auto OFF → am aktuellsten, offenbar am variabelsten, nur der Start über Cron und der damit verbundene feste Uhrzeit-Takt gefällt mir nicht.
Dies ist mein erstes Script-Projekt, daher meine Fragen, bevor ich anfange:
Bin ich auf dem richtigen Weg, wenn ich das Auto_OFF-Script nehme, von einer Service Unit starten lasse und die Konfigurationsdatei so anpasse, dass Port 22 (SSH) und 25565 (Minecraft) geprüft werden? Im Script selbst ist halt wohl auch durch shutdown zu ersetzen? Wie kann ich prüfen lassen, ob Java läuft?
Icke
|
dingsbums
Anmeldungsdatum: 13. November 2010
Beiträge: 3553
|
Wie kann ich prüfen lassen, ob Java läuft?
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | # dieses script: /usr/local/sbin/check-java.sh
#
# der start erfolgt am einfachsten per eintrag in systemweiter /etc/crontab:
# @reboot root /usr/local/sbin/check-java.sh
# warte nach start des servers 15 min
sleep 900
while [ 0 -lt 10 ];do # schleife läuft permanent
ps -A | grep "java" # zu prüfenden prozessnamen anpassen
if [ ! $? -eq 0 ];then # wenn prozess nicht gefunden
systemctl poweroff # system herunterfahren
fi
done
|
|
dingsbums
Anmeldungsdatum: 13. November 2010
Beiträge: 3553
|
Eine bestehende ssh-Verbindung könntest du z.B. nach diesem Schema abfragen: | sudo netstat -tulpena | grep "127.0.0.1:22" | grep -i verbunden
if [ ! $? -eq 0 ];then # keine verbindung gefunden
# hier dein befehl
fi
|
Je nach Systemsprache usw. mußt du die grep-Suchmuster evtl. anpassen.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
dingsbums schrieb: Wie kann ich prüfen lassen, ob Java läuft?
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | # dieses script: /usr/local/sbin/check-java.sh
#
# der start erfolgt am einfachsten per eintrag in systemweiter /etc/crontab:
# @reboot root /usr/local/sbin/check-java.sh
# warte nach start des servers 15 min
sleep 900
while [ 0 -lt 10 ];do # schleife läuft permanent
ps -A | grep "java" # zu prüfenden prozessnamen anpassen
if [ ! $? -eq 0 ];then # wenn prozess nicht gefunden
systemctl poweroff # system herunterfahren
fi
done
|
Kann man so machen, aber 0 < 10 ist doch ein etwas merkwürdiger Ausdruck, um zu sagen "immer" und kann leicht für einen Fehler gehalten werden, der jmd. passiert ist. Ich würde da auf "true" plädieren. | while true # schleife läuft permanent
do
ps -C java # prüfen, ob Prozess namens java läuft.
if [ ! $? -eq 0 ] # wenn prozess nicht gefunden
then
systemctl poweroff # system herunterfahren
fi
sleep 600
done
|
Man muss ps nicht greppen, wenn man mit -C den Namen, nach dem ps schauen soll, übergibt. Da Java keine Sonderzeichen enthält, die der Maskierung bedürfen, lässt man die Anfürungszeichen weg. Ohne sleep wird das Script dutzende Male pro Sekunde ausgeführt - das ist sicher übertrieben. Mit sleep 600 schläft die Abfrage für 10 Minuten - das würde im Falle eines Absturzes des Javaprozesses auch erlauben, im Mittel innerhalb von 5 Minuten den Prozess neu zu starten.
|
dingsbums
Anmeldungsdatum: 13. November 2010
Beiträge: 3553
|
Das sleep zwischendrin habe ich tatsächlich vergessen, da hätte die CPU mal gut zu tun bekommen. Danke für die Korrektur.
|
Icke275
(Themenstarter)
Anmeldungsdatum: 31. Dezember 2012
Beiträge: 130
|
Danke für Eure Hinweise - die haben mir beim Verständnis der verschiedenen Wege sehr geholfen! Ich fummle in den nächsten Tagen mal an einem Entwurf und stelle den dann hier zur Begutachtung.
|
Icke275
(Themenstarter)
Anmeldungsdatum: 31. Dezember 2012
Beiträge: 130
|
Ich habe da mal mein erstes Skript gebaut:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 | #!/bin/bash
# Variablen:
CHECKSUM=0 # Prüfsumme
COUNTER=0 # Durchlaufzähler
# Funktionen:
# Logging in Systemlog:
logit()
{
logger -p local0.notice -s -- AutoShutdownd: $*
}
# Skript:
logit "started"
sleep 1200 # warte nach start des servers 20 min
while true # schleife läuft permanent
do
$CHECKSUM=0 # Prüfsumme auf 0 setzen
# Prüfschritte:
# läuft java?
ps -C java
if [ $? -ge 1 ];then # wenn ja:
$CHECKSUM=$(($CHECKSUM + 1)) # Prüfsumme + 1
fi
# läuft ssh?
sudo netstat -tulpena | grep "127.0.0.1:22" | grep -i verbunden
if [ $? -ge 1 ];then
$CHECKSUM=$(($CHECKSUM + 1))
fi
# Abschlussprüfung:
# keine positiven Prüfungen und zweiter Durchlauf?
if [ $CHECKSUM -eq 0 ] && [ $COUNTER -eq 1 ] ; then
logit "executing shutdown"
sudo shutdown now # fahre herunter
exit 0
# keine positiven Prüfungen aber erster Durchlauf?
elif [ $CHECKSUM -eq 0 ] ; then
$COUNTER=1 # setze Zähler auf 1
logit "preparing shutdown in 10 min"
sleep 600 # warte 10 min
# positive Prüfungen und zweiter Durchlauf?
elif [ $COUNTER -eq 1 ] ; then
$COUNTER=0 # setze Zähler zurück
logit "prepared shutdown aborted"
# positive Prüfungen?
else
sleep 900 # warte 15 min
fi
done
|
Habe ich alle HowTos, Manpages und Beispiele korrekt gelesen, oder sind da hanebüchene Anfängerfehler drin?
Gibt es Dinge, die ich anders oder besser machen sollte?
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
| $CHECKSUM=$(($CHECKSUM + 1))
|
Bei Zuweisungen zu Variablen steht links kein Dollarzeichen:
| CHECKSUM=$(($CHECKSUM + 1))
|
(mehrfache derartige Fehler gefunden). Mit shellcheck (kein Defaultpaket) kannst Du Scripte auf eine gewisse Fehlerauswahl per Programm prüfen. Nicht jede Warnung ist dabei gerechtfertigt, aber es ist deutlich besser als nichts und die Warnungen führen selten zu Fehlern, wenn man sie befolgt.
|
Icke275
(Themenstarter)
Anmeldungsdatum: 31. Dezember 2012
Beiträge: 130
|
user_unknown schrieb: Mit shellcheck (kein Defaultpaket) kannst Du Scripte auf eine gewisse Fehlerauswahl per Programm prüfen. Nicht jede Warnung ist dabei gerechtfertigt, aber es ist deutlich besser als nichts und die Warnungen führen selten zu Fehlern, wenn man sie befolgt.
Danke für die Hinweise, korrigiert und ausprobiert:
icke@asterix:$ shellcheck AutoShutdownd
In AutoShutdownd line 13:
logger -p local0.notice -s -- AutoShutdownd: $*
^-- SC2048: Use "$@" (with quotes) to prevent whitespace problems.
^-- SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
logger -p local0.notice -s -- AutoShutdownd: "$*"
In AutoShutdownd line 30:
CHECKSUM=$(($CHECKSUM + 1)) # Prüfsumme + 1
^-------^ SC2004: $/${} is unnecessary on arithmetic variables.
In AutoShutdownd line 36:
CHECKSUM=$(($CHECKSUM + 1))
^-------^ SC2004: $/${} is unnecessary on arithmetic variables.
For more information:
https://www.shellcheck.net/wiki/SC2048 -- Use "$@" (with quotes) to prevent...
https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
https://www.shellcheck.net/wiki/SC2004 -- $/${} is unnecessary on arithmeti... Auch das korrigiert, zweiter Durchlauf ohne Ausgabe.
Am kommenden Wochenende probiere ich es aus, wenn das dann klappt, geht der Thread auf "gelöst".
|