ubuntuusers.de

Shellscript starten, wenn sich logfile ändert

Status: Gelöst | Ubuntu-Version: Ubuntu 10.10 (Maverick Meerkat)
Antworten |

mic-e

Anmeldungsdatum:
3. Januar 2008

Beiträge: 23

Wohnort: Würzburg, BAY

Hallo,

zunächst eine kurze Erläuterung meiner Situation:

ich habe auf meinem Server einen Minecraft-(Game)server laufen. Dieser läuft innerhalb eines screens, so dass ich ihm jederzeit via

screen -S $SCREEN_NAME -p 0 -X stuff "`printf "...\r"`"

einen Befehl schicken kann (z.B. via Webinterface zum Neustarten des Servers). Das funktioniert auch alles super.

Ich will die Funktionalität meines "Servermanagementscripts" nun allerdings derart erweitern, dass ein User auch von innerhalb des Spiels Kommandos an mein Script senden kann. Beispielsweise könnte ein beliebiger User dann In-Game ein Kommando wie

!restart-server

tippen, um den Server neu zu starten. Es wären aber auch beliebig komplexe Szenarien bis hin zu Vote-Kicks realisierbar.

Nun zum konkreten Problem:

Mein Script soll jedes Mal ausgeführt werden, wenn ein User des Servers eine Chatnachricht abschickt. Ein Eingriff in die Binaries des Servers kommt für mich nicht in Frage. Wenn jemand eine Chatnachricht absendet, dann erscheint diese sowohl als neue Zeile in der Textausgabe des Servers, also auch in der Datei server.log.

Ist es möglich, automatisch ein Script auszuführen, wenn die server.log-Datei geschrieben wird und/oder sich die Terminalausgabe eines Programmes innerhalb eines screens verändert?

Die "eleganteste" Lösung, die mir im Moment einfällt, wäre das script gemeinsam mit dem Server zu starten und in einer Endlosschleife jede Sekunde die Logfile daraufhin zu überprüfen, ob sie sich geändert hat. Ihr werdet mir aber sicherlich zustimmen, dass dies nicht einmal als Notlösung wirklich geeignet wäre, zum Einen wegen des konstanten CPU- und Speicherverbrauches, und zum Anderen wegen der dadurch entstehenden Verzögerungen von bis zu 1 Sekunde.

Vielen Dank für eure Hilfe, Michael

Zombie_im_Bademantel

Avatar von Zombie_im_Bademantel

Anmeldungsdatum:
13. April 2005

Beiträge: 655

Da kannst du dir sicher recht simpel etwas mit den inotify-tools basteln.

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

es ginge auch

tail --follow=dateiname ...

tail überwacht die Veränderungen im File und gibt das aus, was neu hinzugekommen ist. Das --follow dient dazu, dass die Überwacung an die aktuelle Datei mit diesem Dateinamen gebunden ist, nicht an den iNode (wenn z.B. die aktuelle Datei umbenannt und ein neues File unter diesem Namen angelegt würde - tail -f würde dann das umbenannte File überwachen wollen). CPU-Load wird da keine produziert.

mic-e

(Themenstarter)

Anmeldungsdatum:
3. Januar 2008

Beiträge: 23

Wohnort: Würzburg, BAY

Hallo,

vielen Dank für eure Antworten!

Ich habe das Problem zwar nicht so gelöst, wie ihr es vorgeschlagen habt, aber eure Denkanstöße haben mir ziemlich weiter geholfen 😉

Meine Lösung sieht jetzt so aus (Auszug aus dem Skript):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
	case $1 in
		'--runserver'|'r')
			echo "This command is for internal use only!"
			echo "If you use this command to start the server, this script will not function"
			echo "correctly."
			echo "Please use"
			echo "	$0 --cmd server_start"
			echo "to start the server."

			java -jar minecraft_server.jar 2>&1 | while read LOGLINE; do
				$0 --logline "$LOGLINE"
			done
			exit 0
		;;
		'--logline'|'l')
			LOGLINE="$2"
			if [[ ! $LOGLINE ]]; then
				error 14
			fi
			analyze_logline
		;;
Antworten |