Hozzászólások
Hali!
Egy perl szcripttel seretnek egy daemont futtatni, ami egy pipe-ot dolgoz fel mondjuk a syslog-ng altal gyartott filebol. Sajnos a daemon nem is kerul a while ciklusba, vagy csak par sort olvas a filebol, utanna abbahagyja.
Esetleg tud vki ennel frappansabb megoldast?
#!/usr/bin/perl
use strict;
use DBI;
use POSIX qw(strftime);
use Socket;
#
open(LOG_FILE,"tail --follow=name --retry $log_file 2>/dev/null |") or die "Unable to open log file $log_file : $!\n";
#fork to background
if ($go_to_background) {
my($f) = fork();
if (!defined($f)) { die "Unable to fork : $!\n"; }
if($f) {
# parent
open(PID, ">$pid_file") or die "Unable to create pid file $pid_file: $!";
print PID "$f\n";
close PID;
exit(0);
} else {
# child
close STDIN;
open(STDIN, '</dev/null');
close STDOUT;
open(STDOUT, '>/dev/null');
close STDERR;
open(STDERR, '>/dev/null');
}
}
while (<LOG_FILE>) {
#
}
A daemon futasat hogyan lehet befejezni a scripten beluli parancsal?
- A hozzászóláshoz be kell jelentkezni
Hali!
En a while (<LOG_FILE>) ciklust a child reszebe tennem, igy nem akarna a logfile-be irni egyszerre a parent es a child process is :oops: :oops:
A CLOSE STDIN,STDOUT, es STDERR kihagyasaval pedig "mukodesre" keszteted a dolgot...
Csak valami SIG-gel tudod ertelmesen tudatni a daemonnal, hogy vege...
Zsiraf
- A hozzászóláshoz be kell jelentkezni
Szoval maga a daemon mukodokepes, mert ha a whiel ciklust vegtelenre allitom es adatkat irok file-ba, akkor megy.
Kiprobaltam amit irtal, most igy nez ki:
#fork to background
if ($go_to_background) {
my($f) = fork();
if (!defined($f)) { die "Unable to fork : $!\n"; }
if($f) {
# parent
open(PID, ">$pid_file") or die "Unable to create pid file $pid_file: $!";
print PID "$f\n";
close PID;
exit(0);
} else {
# child
open(LOG_FILE,"tail --follow=name --retry $log_file 2>/dev/null |") or die "Unable to open log file $log_file : $!\n";
while (<LOG_FILE>) {
#
}
}
}
De most is ugyanez a helyzet, legyszives segits. Ez a perl daemon dolog nem igazan tiszta szamomra, segits megerteni.
- A hozzászóláshoz be kell jelentkezni
[code:1:0b36c9d529]
#!/usr/bin/perl
use File::Tail;
$pidfile = "/home/macskas/fork.pid";
$logfile = "/var/log/messages";
$SIG{CHLD} = sub { wait };
unless ($pid = fork)
{
unless (fork)
{
open(PID,">$pidfile");
print PID "$$\n";
close(PID);
$r = tie *SYSLOG, "File::Tail", (name => "$logfile",maxinterval => 1);
while(<SYSLOG>)
{
#chomp;
}
exit 0;
}
exit 0;
}
waitpid($pid,0);
[/code:1:0b36c9d529]
en a helyedben igy csinalnam.
#szerkesztes mer kimaratt pid irasa :)
- A hozzászóláshoz be kell jelentkezni
[quote:30442d0ae7="gabcsi"]
De most is ugyanez a helyzet, legyszives segits. Ez a perl daemon dolog nem igazan tiszta szamomra, segits megerteni.
Az open(STDIN, '</dev/null');
open(STDOUT, '>mittudomenmi.txt');
es az open(STDERR, '</dev/null'); maradjon!!! csak a
close(XXX-t) hagyd el :-)
Zsiraf
Ize ez nekem mukodott:
[code:1:30442d0ae7]#!/usr/bin/perl
#use strict;
use DBI;
use POSIX qw(strftime);
use Socket;
#
open(LOG_FILE,"tail --follow=name --retry /var/log/boot </dev/null 2>/dev/null |") or die "Unable to open log file $log_file : $!\n";
#fork to background
if (1) {
my($f) = fork();
if (!defined($f)) { die "Unable to fork : $!\n"; }
if($f) {
# parent
open(PID, ">pid_file") or die "Unable to create pid file $pid_file: $!";
print PID "$f\n";
close PID;
exit(0);
} else {
# child
open(STDIN, '</dev/null');
open(STDOUT, '>dlog.txt');
open(STDERR, '>/dev/null');
while (<LOG_FILE>) {
#
print;
}
close(STDOUT);
}
}
[/code:1:30442d0ae7]
- A hozzászóláshoz be kell jelentkezni
Nagyon koszonom a segitseget, aszt hiszem most mar tudom folytatni.
Esetleg meg annyi lenne a kerdesem , hogy honnan lehet ne ilyen mely szintu ismeretere szert tenni.
A magyar perl levlistan szinte senki nem veszi a faradsagot, hogy esetleg egy temat megmagyarazzon (mondjuklehet hogy, nem is azert van).
- A hozzászóláshoz be kell jelentkezni
[quote:38a913ccdb="gabcsi"]Nagyon koszonom a segitseget, aszt hiszem most mar tudom folytatni.
Esetleg meg annyi lenne a kerdesem , hogy honnan lehet ne ilyen mely szintu ismeretere szert tenni.
A magyar perl levlistan szinte senki nem veszi a faradsagot, hogy esetleg egy temat megmagyarazzon (mondjuklehet hogy, nem is azert van).
man perlfunc, man perlopentut, man perldata man perlvar ...
;-)
Zsiraf
p.s.: amugy ezt a CLOSE bulit nem teljesen ertem, de a perlopentut-ban az stdxxx ujranyitasakor nem hasznal close-t...
- A hozzászóláshoz be kell jelentkezni