in reply to getting a posix daemon and a web server to work together

as far as i understand your code, it tries to restart itself after the occurrence of any of the trapped signals. obviously this will run into an endless loop. apart from this i wonder whether you always know, in which of the several processes you create you're actually being in. you might get a cleaner and thus less error prone code if you switch from fork'ing to threads. because then everything will be part of one process, you'll be able to install common hooks for all signals - and besides you will have a simple means of generating log messages, which will probably help you find all the other things that aren't working as you expect them to do. e.g.:
#!/usr/bin/perl -w use strict; [...] # use whatever else use threads; use threads::shared; use Thread::Queue; [...] sub logger; our ($logs, $logger); $logs = Thread::Queue->new; $logger = threads->new(\&logger, "/path/to/logfile"); our $DEBUG : shared = 1; # care for signals: $SIG{INT} = $SIG{QUIT} = $SIG{CONT} = $SIG{STOP} = $SIG{TSTP} = $SIG{CHLD} = $SIG{TRAP} = $SIG{USR1} = $SIG{TTIN} = $SIG{TTOU} = $SIG{VTALRM} = $SIG{ALRM} = \&sig_ignore; $SIG{PIPE} = \&sig_pipe; $SIG{BUS} = $SIG{ILL} = $SIG{SEGV} = $SIG{FPE} = 'DEFAULT'; $SIG{HUP} = $SIG{ABRT} = $SIG{TERM} = $SIG{KILL} = \&sig_handler; $SIG{__WARN__} = $SIG{__DIE__} = sub { $logs->enqueue(shift) }; # now install all the other threads you want to run. # everything they have to do in case something goes wrong, # will be to simply warn() or die() - roughly told. # hence the logger finction is quite simple: sub logger { my $logfile = shift; open LOG, ">>$logfile" || die $!; while (my $msg = $logs->dequeue) { my $line = "[".localtime(time)."] $msg"; chomp $line; print LOG "$line\n"; flush LOG if $DEBUG; } close LOG; } [...] sub sig_ignore { return unless @_; $logs->enqueue("Silently ignoring signal ".shift); } sub sig_pipe { return unless @_; my $warn = "Caught signal ".shift().", "; # append more information to the warning message # if necessary $logs->enqueue($warn); } # the sig_handler() function has to carefully wait for all # threads to terminate properly and then simply exit - # which means again that there is only one process # to care for: sub sig_handler { return unless @_; $logs->enqueue(undef); $logger->join; [...] exit 0; }
these were very short excerpts from a daemon that i once wrote and which has now been running for years. without their context the lines may look rather obfuscating at the first glance, but i think that after a lecture on perldoc perlthrtut you will understand what they're intending.

hope i could be some sort of helpful
regards
--------------------------------
masses are the opiate for religion.

Replies are listed 'Best First'.
Re^2: getting a posix daemon and a web server to work together
by Hardy (Initiate) on Aug 08, 2007 at 03:41 UTC
    I thought about threads in the beginning but my host provider said threads were not being supported on their servers because threads were not safe for most modules or something like that. Is there any way to turn off the daemon commands for the children only? I really need help because I don't want to crash their servers again with my endless loop. why exactly was it ending up in an endless loop? --- skype: hardManHardy ---
    ...waiting for the world to change...
      also, what host provider are you using to run your thread daemon on and how much does it cost? I am trying to write a daemon and a web server for turn based multi player games. this is why I need a web server accepting clients (lots of clients) and why I need a daemon to keep the script running at all times.
      Skype: hardManHardy
      ...waiting for the world to change...
        i'm using a root server on which i am free to install whatever i like. costs are at 70 euros per month, with practically no bandwidth limitation.
        --------------------------------
        masses are the opiate for religion.