|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 08 Jun 2001 13:56:34 To : drcitynet kz Subject : Re: демон -------------------------------------------------------------------------------- Здравствуй, dr@citynet.kz. dck> господа, подскажите почему сей кусочек кода работает неккоректно (не dck> пишется лог-файл), либо отправьте куда-нибуль читать про написание dck> демонов. dck> ########################################################################### dck> ########### #!/usr/bin/perl dck> use POSIX qw(setsid); dck> sub daemon_init; dck> sub sig_handler; dck> sub get_time; dck> $logfile = '>/var/log/billingd.log'; dck> ################################ dck> # Main program code starts here dck> # dck> daemon_init(); dck> open (LOGFILE, $logfile) || die "Error opening $logile! $!\n"; Предположим, у тебя open обломался. Куда полетит die после setsid()? Эксперимент показал, что при запуске из шелла - в тот терминал, из которого запущено, а, скажем, у программ, запущенных из pppd'шного ip-up, STDERR уже перенаправлен в /dev/null. dck> ($date, $time) = get_time(time); dck> #print "$date $time\n"; dck> print LOGFILE "$date $time billingd sucessfully started\n"; dck> until ($time_to_die) { dck> sleep(1); dck> print LOGFILE "running!\n"; dck> } dck> print LOGFILE "$date $time billingd killed\n"; dck> close (LOGFILE) || die "Error closing $logfile! $!\n"; dck> sub daemon_init dck> { dck> # fork and wait for parent exit dck> $pid = fork; dck> exit if $pid; dck> die "Fork error! $!" unless defined($pid); dck> # dissociate from the controlling terminal dck> setsid(); dck> # set signal handler dck> $SIG{INT} = $SIG{TERM} = $SIG{HUP} = \&sig_handler; dck> } dck> sub sig_handler dck> { dck> $time_to_die = 1; dck> } dck> sub get_time dck> { dck> (my $sec,my $min,my $hour,my $mday, my $mon,my $year,my $wday,my $yday,my dck> $isdst) = localtime($_[0]); dck> $year += 1900; $mon += 1; dck> $sec = "0$sec" if (length($sec) < 2); $min = "0$min" if (length($min) < dck> 2); $hour = "0$hour" if (length($hour) < 2); $mday = "0$mday" if dck> (length($mday) < 2); $mon = "0$mon" if (length($month) < 2); $year = dck> "0$year" if (length($year) < 2); return "$year-$mon-$mday", dck> "$hour:$min:$sec"; } ###################################################### dck> ################################# dck> зыж может кто-нибудь поможет чуть-чуть подправить get_time, чтоб оно dck> выглядело более элегантно. чувствую, что можно сделеть на регекспах, но dck> не знаю как реализовать условие 'меньше чем' use POSIX qw(strftime); man strftime Хинт: strftime умеет printf-like форматирование полей. То есть "%03d" даст тебе поле из трех цифр, заполненное с переди нулями. -- Artem Chuprina E-mail: ran@ran.pp.ru Programmer FIDO: 2:5020/371.32 Memonet Ltd. Phone: +7-095-284-1356 --- ifmail v.2.15dev5 * Origin: NTV Internet (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/1648320b22e54.html, оценка из 5, голосов 10
|