[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: perl cgi problem



The problem is that perl is wait()ing for the daemon to return before
exiting.

>From man perlipc:

       Complete Dissociation of Child from Parent

       In some cases (starting server processes, for instance)
       you'll want to completely dissociate the child process
       from the parent.  This is often called daemonization.  A
       well behaved daemon will also chdir() to the root direc
       tory (so it doesn't prevent unmounting the filesystem con
       taining the directory from which it was launched) and
       redirect its standard file descriptors from and to
       /dev/null (so that random output doesn't wind up on the
       user's terminal).

           use POSIX 'setsid';

           sub daemonize {
               chdir '/'               or die "Can't chdir to /: $!";
               open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
               open STDOUT, '>/dev/null'
                                       or die "Can't write to /dev/null:
$!";
               defined(my $pid = fork) or die "Can't fork: $!";
               exit if $pid;
               setsid                  or die "Can't start a new session:
$!";
               open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
           }

       The fork() has to come before the setsid() to ensure that
       you aren't a process group leader (the setsid() will fail
       if you are).  If your system doesn't have the setsid()
       function, open /dev/tty and use the "TIOCNOTTY" ioctl() on
       it instead.  See tty(4) for details.

       Non-Unix users should check their Your_OS::Process module
       for other solutions.


----------------------------------------------------------------------
Andrew J Perrin - http://www.unc.edu/~aperrin
Assistant Professor of Sociology, U of North Carolina, Chapel Hill
clists@perrin.socsci.unc.edu * andrew_perrin (at) unc.edu


On Fri, 8 Aug 2003, Henning Moll wrote:

> Hi!
>
> I use a perl cgi script to start a daemon via http-request:
>
>
> ---ttt.pl---
> [...]
> 	system("daemon &");
> [...]
> 	print "<html> ... </html>";
> ---ttt.pl---
>
> starting of the daemon works, but the http-request is never answered
> completley (That means, the browser is waiting for more data forever...).
>
> The cgi process is not finished, a 'ps -aecf' shows
>
> www-data 12011 12010 -    30 01:14 ?        00:00:00 [ttt.pl] <defunct>
>
> Hmm, <defunct>, what does that mean? How to start the daemon the right way?
>
> Best regards
> Henning
>
>
> --
> To UNSUBSCRIBE, email to debian-user-request@lists.debian.org
> with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
>
>



Reply to: