Perl, SIGHUP-ra változó újratöltése

van nekem egy ilyenem a scriptem elejen:


my %a = (
     2, 'foo',
     4, 'bar',
     5, 'baz',
    10, 'xyz'
);

a programom daemonkent fut (a fenti definialas a while()-on kivul van), azt szeretnem megoldani, hogy ha kap egy SIGHUP-ot a progi, akkor toltse be ujra a %a valtozot. a cel az lenne, hogy futas kozben modositom egy vi-jal a script file %a definicioit akkor egy hup-ra ujraolvassa azt a daemon. gondolom ez igy nem megoldhato, valszeg kulso fileba kellene tenni es onnan do()-val includeolni.

thx.

Hozzászólások

Hali!

azt szeretnem megoldani, hogy ha kap egy SIGHUP-ot a progi, akkor toltse be ujra a %a valtozot.
Szerintem a HUP helyett inkabb az USR1, etc-t hasznald, hiszen azok vannak arra, a SIGHUP az masra van. Ne kavarjuk fel a szart, ha nem muszaj....

a cel az lenne, hogy futas kozben modositom egy vi-jal a script file %a definicioit
Ne tedd, inkabb hasznalj kulso file-t. Jobb a bekesseg... (de ne keseredj el, amugy megoldhato, de ne tedd!!!) Nomeg ez pont a config file-ok terulete...

Zsiraf

p.s.: Ja: RTFM:
man 7 signal
man 3 sigtrap

p.s.2:


#!/usr/bin/perl

use sigtrap 'handler', \&my_handler, 'USR1';

sub my_handler
{
    print "SIGUSR1!!!!\n";
}

while(1) {
;
}

koszi, jo lesz akkor a sigusr1 is, azert gondoltam eredetileg hup-ra, mert a legtobb programnal ez a config reload-ot jelenti.

de akkor mar csak a tanulas kedveert: hogy lehetne megoldani a fileon belul modositott valtozo ujraolvasasat? en elso korben valami olyasmire gondoltam, hogy sub()-ba tenni a valtozo definialast, s adott handler ezt a fv()-t hivna meg. ez lenne a jarhato ut?

ez igy nem megoldhato, ha atirod a filet futas kozben, de nem olvasod ujra es ugy futtatod a subot, attol meg a program elinditasanak pillanataban leforditott kod fut futni.

mindenkeppen do kell, egy egyszeru pl:

use sigtrap 'handler', \&my_handler, 'USR1';
use strict;
use warnings;
no warnings qw( redefine );

sub load{
my $x;
eval { $x = do conf }; // conf a config file neve, hibaellenorzes
print $@ if $@;
$x;
}

my $a = load;

sub my_handler
{
print "SIGUSR1!!!!\n";
$a = load;
}

while(1) {
print "$a\n";
sleep 5;
}

van egy conf nevu file is, ami tartalmazza azt a perl kifejezest, amit szeretnek a valtozonak adni.