PDA

View Full Version : PerlMod + Linux und das PID File...


Nightwing
26-09-2009, 11:49
Ich habe ein Problem mit einer Funktion meines erweiterten PerlMod's (http://forum.teamspeak.com/showthread.php?t=44946) unter Linux.
Ich selbst nutze einen Windows Root, da ich von Linux keine Ahnung habe.
Den Mod haben sich zwar knapp 300 Personen runtergeladen, aber Feedback über folgenden Fehler bekam ich nur von 1 (!!!) Person. (Ob soviele Leute Winroots haben?? Zweifelhaft...)

Ich habe eine Funktion eingebaut, die alle x Minuten (Standard 5) die Settings des PerlMods neu einliest und zudem beim neu einlesen nur noch Fehlermeldungen ins Commandwindow schreibt, keine Bestätigungen (alles andere wäre Spam).

Die Funktion sieht so aus:

ts2perlmod.pl:

# reload config
if($last_config_reload + $settings{reload} < time()) {
%config = &readConfig();
%settings = %{&checkFeatureSettings($ts2,\%config)};
$last_config_reload = time();
}


Ich habe gestern mit einem befreundeten Linuxadmin getestet, der Mod crasht beim Reload der Settings.
Er meinte, es hätte etwas mit dem PID File zu tun. Ich kanns nicht genau wiedergeben, da das für mich Böhmische Dörfer sind :confused:
Unter Windows funktioniert alles tadellos.

Nun, da ich davon keine Ahnung habe, bitte ich um Hilfe & Erklärung, wie das PID File überhaupt funktioniert bzw. den Reload stören kann, da ich ja "nur" die Funktionen readConfig() und checkFeatureSettings() neu lade, nicht den ganzen Startprozess.

Ich fände es unschön, eine Variable einzubauen, in der man dann per Config einstellen kann, ob es sich um einen Linux oder Windowsserver handelt, da dann Linuxuser klar im Nachteil wären.

Danke für Eure Hilfe.

ToM

/dev/null/
26-09-2009, 12:26
Was eine PID File ist kannst du hier erfahren:
http://en.wikipedia.org/wiki/Process_identifier

Warum das Script abstürtzt könnt möglicherweise an Fehlenden Rechten liegen und/oder
das dieses Script die PID File nicht "Überschreiben" darf.

Evtl. kannst du das vor dem Reload in etwa so lösen:
if [ -f ${PIDFILE} ]; then
rm ${PIDFILE}
fi
exit 0

nsateam
26-09-2009, 12:26
PID = Prozess ID
Das müsstest du eigentlich kennen.

Ich verstehe Linux auch nicht wunderbar aber wie wäre es denn wenn du den PerlMod alle 5 Minuten neu starten lässt. Denn wenn ein Prozess ausgeführt wird kann er nicht noch einmal gestartet werden.
Programmier den so das er bei jedem "Refresh" neu startet und dadurch erst die alte PID löscht und dann eine neue anlegt.

Nightwing
27-09-2009, 14:12
@ /dev/null:

Wenn ich das PID File lösche, bringt das leider nichts. So weiss Linux nur nicht mehr, welche ID der Prozess hat --> Du müsstest den dann umständlich killen.

@ nsa-team:

Da ich nicht neustarte, sondern nur die settings neu einlese, läuft ja der aktuelle Prozess weiter.
Mit Windows tut die Sache tadellos, er liest die Settings neu ein und das wars.

Ich bekomm leider absolut keine Fehlermeldung, die mir weiterhelfen würde, weder in Putty noch im Logfile. :confused:
Das erschwert die Sache ziemlich.

ToM


PS: Hab grad mal ein neues Release, indem die Funktion unter Linux ignoriert wird, solange bis ich das Problem in Griff bekomme.

Nightwing
27-09-2009, 19:20
Gibt es bei PERL eine Variable, die zurückgibt, in welchem Pfad das Programm ausgeführt / gestartet wird?

Hintergrund:

Wenn der Mod mit Daemon läuft, findet er mangels Pfad die config nicht.
Wird mit Screen gestartet oder mit direkter Eingabe, dann funktioniert der Reload.

ToM

/dev/null/
29-09-2009, 22:35
$ perldoc FindBin
( use FindBin )

Nightwing
29-09-2009, 23:16
Danke!

Ich hab jetzt mal das hier drin:

use Cwd;

# $scriptdir got the absolute path. important for linuxboxes!
my $scriptdir = getcwd;

ToM

/dev/null/
30-09-2009, 00:10
Jo geht natürlich auch, ist in gewissen Fällen aber evtl. nicht gerade der Optimale Weg.


ACHTUNG! Noch nicht aktuell!
Und hier für alle nochmal, damit keine weiteren unnötigen Fragen entstehen die:

LÖSUNG (http://hellzone-am.de/index.php?site=files&file=46)

Nightwing
30-09-2009, 00:19
Öhm, Du verlinkst auf meine Page und auf eine alte Version, in der die Reloadfunktion für Linux hardcoded deaktiviert ist, solange bis ich eine Lösung für Linux habe. ;):D
Das ist leider nur eine Notlösung...

Ich muss noch ein paar Tests fahren, bin aber guter Dinge, Version 2.2 noch diese Woche zu releasen.

ToM

PS: Danke für Deine FindBin Funktion, wenn die andere nicht funzt / Bugs aufwirft, werd ich die reinnehmen.