- Registriert
- 01.04.05
- Beiträge
- 1.973
Hallo,
ich hab ein neues Perl-Problem.
Perl als Skript ist ja recht nett und vor allem effizient, nun hab ich aber eine komplexe Lösung entwickelt, die ich gerne dauerhaft laufen lassen möchte als Daemon, losgelöst von der Shell oder Benutzer.
Daher bin ich auf der Suche nach einem möglichen Ansatz:
mein jetziger sieht so aus:
Für das Programm sind dann zwei externe Module nötig. Das wären Proc:
aemon und Proc:
ID::File (beides externe Links auf CPAN.org
Problem an dem Skript ist derzeit folgendes:
Es wird nur sehr unregelmässig (auf 4 Systemen getestet, auf einem klappts) eine daemon.pid in /var/run angelegt.
Soweit ich es verstanden habe, müsste diese pid-File aufgrund der Initialisierung des Daemons (Proc:
aemon::Init) angelegt werden.
In dieser steht dann die aktuelle PID des Daemons drin. Diese wird ausgelesen und z.B. für die Beenden-Prozedure, die durch den Programmaufruf + stop eingeleitet wird, dann beendet. Jedoch hat dies noch nie geklappt.
Habt ihr irgendwelche Ideen wie man mein Wirrwarr ordnen kann? Was hab ich vergessen bzw. wo ist der eigentliche Fehler in meiner Logik?
PS: als initialisierte Daemon werden auch irgendwie alle Kanäle geschlossen. Ich hab nicht mehr die Möglichkeit über FileHandler oder die STDOUT, STDIN, STDERR fehler auszugeben oder sonst etwas nach außen dringen lassen. Wie kann ich meinen Daemon wieder gesprächig kriegen?
Änderung betreffend PS: Ich denke die Lösung für Phänomen gefunden zu haben: Siehe Link: Wheel::Run and Proc:
aemon troubles - another solution
ich hab ein neues Perl-Problem.
Perl als Skript ist ja recht nett und vor allem effizient, nun hab ich aber eine komplexe Lösung entwickelt, die ich gerne dauerhaft laufen lassen möchte als Daemon, losgelöst von der Shell oder Benutzer.
Daher bin ich auf der Suche nach einem möglichen Ansatz:
mein jetziger sieht so aus:
Code:
#!/usr/bin/perl
use strict;
use locale;
use warnings;
use Proc::Daemon;
Proc::Daemon::Init;
use Proc::PID::File;
print "Programmstart:\n";
my $start = 0;
my $pid;
my $datei = "logdatei.txt";
open (DATEI,">$datei");
if (!defined(@ARGV))
{
print "Bitte folgende Optionen mitangeben: {start|stop}\n";
exit (0);
}
if (@ARGV && $ARGV[0] eq "start")
{
if (Proc::PID::File->running(name=>"daemon"))
{ print DATEI "Prozess laeuft bereits!";
exit (0);
}
print DATEI "Prozess wird gestartet...\n";
$pid = Proc::PID::File->running(name => "daemon");
$start = 1;
print DATEI "Meine Process-ID ist: $pid\n";
}
$SIG{INT} = sub {
$::exit = 1;
$start = 0;
};
if (@ARGV && $ARGV[0] eq "stop")
{
unless ($pid)
{ die "Prozess nicht vollstaendig implementiert!\n" }
$pid = Proc::PID::File->running(name => "daemon");
kill(9,$pid) or die "Konnte Daemon nicht stoppen!\n";
print "Stopsignal wurde gesendet!\n";
exit;
}
while ($start)
{
exit if $::exit;
sleep(5);
.... # Hier folgt dann das eigentliche Programm
}
close DATEI;
Für das Programm sind dann zwei externe Module nötig. Das wären Proc:


Problem an dem Skript ist derzeit folgendes:
Es wird nur sehr unregelmässig (auf 4 Systemen getestet, auf einem klappts) eine daemon.pid in /var/run angelegt.
Soweit ich es verstanden habe, müsste diese pid-File aufgrund der Initialisierung des Daemons (Proc:

In dieser steht dann die aktuelle PID des Daemons drin. Diese wird ausgelesen und z.B. für die Beenden-Prozedure, die durch den Programmaufruf + stop eingeleitet wird, dann beendet. Jedoch hat dies noch nie geklappt.
Habt ihr irgendwelche Ideen wie man mein Wirrwarr ordnen kann? Was hab ich vergessen bzw. wo ist der eigentliche Fehler in meiner Logik?
PS: als initialisierte Daemon werden auch irgendwie alle Kanäle geschlossen. Ich hab nicht mehr die Möglichkeit über FileHandler oder die STDOUT, STDIN, STDERR fehler auszugeben oder sonst etwas nach außen dringen lassen. Wie kann ich meinen Daemon wieder gesprächig kriegen?
Änderung betreffend PS: Ich denke die Lösung für Phänomen gefunden zu haben: Siehe Link: Wheel::Run and Proc:

Zuletzt bearbeitet: