• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

tail einer logdatei->wenn mit "say:" beginnt safe in MySQL

schnoog

Newbie
Hallo zusammen,
wie die Jungfrau zum Kind, bin ich zu einem Root Server gekommen.
Da ich mich mit der Konsole nicht wirklich gut auskenne und ein Problem nicht gelöst bekomme,
bin ich mal so frei und schildere dieses hier.

Ausgangslage:
Ich habe einen Root-Server bei Hetzner stehen, auf dem einige Gameserver (ET) laufen.
Diese schreiben ihre Ausgaben in die datei "/games/etw1/etpro/etconsole.log"

Nun stehe ich vor dem Problem, dass es in letzter Zeit des Öfteren vorkommt, das Leute bei uns von irgendwelchen anderen beleidigt werden.
Ich möchte nun für meinen CO-Admin (moderiert die Gameserver, jedoch kein Root-Zugriff) ein Skript basteln, das folgendes tut:

Jeweils die letzte Zeile der Logdatei auslesen.
Wenn diese Zeile mit "say:" beginnt, soll die Zeile in einer Tabelle meiner MySQL Datenbank eingetragen werden.

Das speichern in der MySQL DB würde ich so machen:
Code:
vara="hier soll die entsprechende Textzeile hin;
echo "Insert Into \`saytbl\` (\`Say\`) VALUES(\"$vara\")" | mysql -hlocalhost -uMeinDBUser -pMeinDBPass saydb

auch das tail an für sich ist nicht das Problem
Code:
tail -f /games/etw1/etpro/etconsole.log

Mein Problem ist nun, wie ich das alles so aneinander reihe, dass neue Einträge in der Log-Datei, die mit say: beginnen auch in der DB landen.

Wäre furchtbar nett, wenn mir jemand dabei helfen könnte.

Vielen Dank

Schnoog
 

nbkr

Guru
Das liefert dir die Infos:

Code:
tail -f /games/etw1/etpro/etconsole.log | grep ^say:

So bekommst Du das aber nicht in ein Shellscript, da Tail ja die ganze Zeit läuft. Da musst Du dir noch was anderes überlegen. Eine Idee wäre nur grep im Shellscript zu verwenden und das Script per Cron alle 5 Minuten laufen zu lassen. Das script muss dann natürlich prüfen ob es die gewünschte Zeile schon in der DB hat. Damit wird es mit einem reinen Shellscript schon wieder etwas schwieriger, da würde ich auf Pyhton, PHP oder Perl umsteigen.
 
Code:
tail -f /games/etw1/etpro/etconsole.log | grep ^say:
Sobald man an dem o.a. Kommando noch ein weiteres Pipe anhängt dürfte grep die Daten erst weiter geben, wenn eine
bestimmte Blockgröße erreicht ist.

Könnt Ihr ja mal testen.

Code:
touch /tmp/aa
tail -f /tmp/aa | grep say
# auf zweiter Session:
tail -f /tmp/aa | grep say | grep say
# in einer dritten Session
echo say >> /tmp/aa
echo say >> /tmp/aa
Nur in der ersten Session wird das say direkt angezeigt. In der zweiten Session kommt nichts, bis ein Block (?) voll ist. Und dann kommt
alles auf einmal.
Ich würde also vorschlagen eine Lösung zu nehmen, in der das erste Programm gleich die Aktion macht.
awk '/say:/ { system ("echo ... | ...."); }' </games/etw1/etpro/etconsole.log

Haveaniceday
 
Oben