Daemon umschreiben (Perl)

U

ushellpr

Grünschnabel
Hallo Leute,
ich versuche schon seid einigen Tagen einen Deamon umzuschreiben. Der Deamon hat einige Module, die in Perl geschrieben sind, die ebenfalls immer Laufen. Ich habe einige erfolgreich editieren können, aber die haben gar keinen Effekt gezeigt.

Der Daemon beaufsichtigt einen Gewissen Prozess und wenn ereignisse eintreten, werden diese in eine MySQL Datenbank eingetragen, quasi als Protokoll mit Details und Informationen. Zusätzlich möchte ich aber, dass ein shell script ausgeführt werden soll, gleich nach dem Eintrag in der Datenbank.

Ich hatte es bisher so gemacht, dass ich während der Daemon gelaufen ist, die Perl scripte verändert habe und den kompletten Rechner neugestartet. Aber nichts hatte funktioniert, die Datenbank einträge erschienen, aber das Script wurde nicht ausgeführt. Also habe ich die Shellscript anweisung vor der schleife verlegt, die die Datenbank Einträge macht. Diesmal gab es Probleme, das Perl script ist immer im 2-3 Minuten Takt abgestürzt bzw hat sich neu gestartet. Die exec() anweisung liegt aber definitif zusammen in einer Schleife mit der MySQL Datenbank Eintrag Anweisung.

Was mache ich Falsch?
Wie muss ich diese Module bearbeiten. Welchen Ansatz schlägt ihr mir vor?

Danke für Hilfe im Vorraus
 
Zuletzt bearbeitet:
Was gibt dir ein solches Skript aus?

Code:
#!/usr/bin/perl -w

my $out = `deinskript.sh`;
print $out."\n";

Natürlich den Pfad zu deinem Shell-Skript einsetzen. Und die Backticks beachten. Ich tippe nämlich mal, dass dein Shell-Skript evtl. keinen richtigen Exit-Code zurückgibt o.ä.

Ansonsten wäre ein Code-Beispiel von dir brauchbar.
 
Hallo,
danke für deine Antwort.

Es gibt nichts aus, gar nichts, sie wird nichtmal aufgerufen im Perl Script.

Code würde ich gerne posten, aber ich darf nicht, welche Teile bräuchtest du denn genau, ich kann sie dir beschreiben.

Die Anweisung für den SQL eintrag ist in einer eval{] schleife drinnen. Dort habe ich auch die exec() anweisung hinkopiert.

Wieso wird in dem Perl Script die exec() anweisung einfach ignoriert. Wenn ich sie vor dem SQL do Befehl hinfüge, stürzt das Perl Script immer ab. Das ist gar nicht gut.

Ich denke, es hat irgendetwas zu tun damit, dass ich dieses Perl Script anders editieren muss.

Grüße
 
Wenn es nichts ausgibt, muss das ja nicht unbedingt falsch sein, es sei denn, es soll was ausgeben. In dem Fall solltest du einfach mal dein Shell-Skript korrigieren, da das Problem dann nicht bei Perl liegt. Woran machst du fest, dass es nicht ausgeführt wird?
 
Hallo,
das Shell script muss bestimmte Sachen erledigen, die tut es einfach nicht. Nebenbei soll es auch eine LOG Datei erstellen, alle chmods sind hierfür gesetzt und die LOG datei ist immer leer. Zuerst dachte ich, dass dieses evtl. die LOG nicht findet, habe deshalb alle Pfade zu absoluten Pfaden geändert und den quellcode mehrfach überprüft. Nichts geht.

Wenn ich das shel script so per Hand starte, funktioniert es einwand frei und tut seine Aufgabe. D.h. es muss definitiv an Perl liegen, es will einfach nicht das ding aufrufen.. :(

im Kopf der PERL datei steht

use DBI;
use strict;

danach kommt eine Konfiguration zum MySQL Server (Name, DB, PW etc.)

Der Restliche Quelltext besteht aus eine Art Funktionen Sammlung, diese sind in subs eingegliedert (sub main, sub time_stamp, sub schlagmichtot)

Die DB Einträge werden in einer eval Schleife gemacht, in ihr befindet sich die Anweisung mit Exec. Sollte ich die dort rausnehmen?

Hoffe diese Informationen können helfen.

Danke :-)
 
eval berechnet in Perl den als Argument angegebenen Ausdruck. Es ist also ziemlich unnötig den Aufruf eines Shell-Skripts in ein eval zu packen. Siehe dazu auch http://perldoc.perl.org/functions/eval.html Du solltest den Aufruf eher nach dem eval-Block/Ausdruck machen.
 
Warum werden die DB Einträge in einem eval-Block (nicht eval-"Schleife") gemacht?
Dafür gibts normalerweise einen guten Grund. Findest du den heraus weist du, ob du den Scriptaufruf inner- oder außerhalb des evals hinpacken musst.

BTW, bist du dir sicher, dass du weist, was du da tust?
Kennst du die Beschreibung von exec? Warum benutzt du nicht system?
perldoc schrieb:
The exec function executes a system command and never returns-- use system instead of exec if you want it to return.
(Bei nem Daemon würde ich erwarten, dass man mit "exec" extrem sparsam sein sollte..)

Da hilft btw auch kein eval Block: (das Einzige was der abfängt ist afaik "die")
Code:
print "before eval\n";
eval {
    exec 'echo hello from exec';
};
print "after eval\n";
# Ausgabe:
before eval
hello from exec


Code würde ich gerne posten, aber ich darf nicht, welche Teile bräuchtest du denn genau, ich kann sie dir beschreiben.
Dies wage ich zu bezweifeln.
Die Anweisung für den SQL eintrag ist in einer eval{] schleife drinnen.
Nein, ist sie nicht. Siehe oben.

Hoffe diese Informationen können helfen.
Nicht wirklich, hättest genausogut sagen können "der Quelltext besteht aus Schriftzeichen des lateinischen Alphabets und arabischen Ziffern". (Informationsdichte oszilliert hier um den Nullpunkt.)

im Kopf der PERL [sic!] datei steht

use DBI;
use strict;
Pack da mal noch
Code:
use warnings;
use diagnostics;
dazu. (Direkt nach "use strict" am Besten.)
perldoc schrieb:
Since it's a common mistake to use exec instead of system, Perl warns you if there is a following statement which isn't die, warn, or exit (if -w is set - but you always do that)
"-w" als Interpreter-switch und "use warnings;" im Script sind gleich, bis auf das "-w" Warnungen global (also auch in geladenen Modulen) einschaltet, "use warnings;" jedoch nur für das aktuelle Package. (Afair)
Bekommst du danach dann Warnungen, gib diese bitte hier im Wortlaut an.

Die entsprechenden von mir gequoteten Infos kannst du offline mit dem perldoc Programm ("perldoc perldoc") nachlesen. Oder online in html. (siehe bitmunchers link)
 
Zurück
Oben