delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2007/08/15/12:39:43

X-Spam-Check-By: sourceware.org
Message-ID: <46C32C2F.6030505@alink.co.za>
Date: Wed, 15 Aug 2007 17:39:11 +0100
From: George <george AT alink DOT co DOT za>
User-Agent: Thunderbird 2.0.0.6 (Macintosh/20070728)
MIME-Version: 1.0
To: cygwin AT cygwin DOT com
Subject: Trouble with perl fork() and exec()
X-IsSubscribed: yes
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com

Hello,

I have a cygwin installation under which I'm running the 
Net::Server::Fork daemon "munin-node".  For those not aware, munin is a 
monitoring system which is really easy to use and configure 
(http://munin.projects.linpro.no).

That said, it's not working properly.

Here's the trouble I'm having - maybe somebody has seen it before and 
can push me in the right direction?

The basic flow of the daemon is:

<start munin-node which attaches to a port and runs fine>
<connect from other machine1>
<machine1 request plugin>
<server forks() and then exec() the 'plugin' to gather data>
<plugin returns data to parent via STDIN>
<plugin exits>
<parent returns data to machine1>
<sing songs, drink beer>

Now, this is breaking unfortunately, so I never get to sing songs and 
drink beer.

What seems to happen is the child gets fork()ed and then the plugin code 
exec()'d.  The data then comes back up the line via the STDIN to the 
parent, however, despite the child finishing execution (I've made sure 
all sockets are closed and even tried a die()) it never exits.

I've made the sure the data is actually coming back by putting a print 
in the while loop and that shows that it's coming back from the child. 
All the data makes it back, but the while loop doesn't finish and the 
timeout alarm hits, so the child gets reaped.  When it's reaped it 
returns "Interrupted system call".

Ive tried replacing the exec() with a dirty hack of system();exit(); but 
exactly the same thing happens.

The relevant code which does the running of the plugin is below:

(Full code: 
http://munin.projects.linpro.no/browser/branches/1.2-stable/node/munin-node.in)


..
     print "# Forking .. \n" if $DEBUG;
     if ($child = open (CHILD, "-|")) {
       eval {
           local $SIG{ALRM} = sub { $timed_out=1; die "$!\n"};
           alarm($timeout);
           while(<CHILD>) {
             #last if $_ eq "# DONE";
             if ($_ eq "# DONE") { close(CHILD); }
             push @lines,$_;
             print "#DEBUG CHILD: $_" if $DEBUG;
           }
           print "# Finished gathering data from Child\n" if $DEBUG;
       };
       if( $timed_out ) {
           print "# Child timed out - calling reap_children $@ \n" if 
$DEBUG;
           reap_children($child, "$service $command: $@");
           close (CHILD);
           return ();
       }
       unless (close CHILD)
       {
           if ($!)
           {
               # If Net::Server::Fork is currently taking care of reaping,
               # we get false errors. Filter them out.
               unless (defined $autoreap and $autoreap)
               {
                   logger ("Error while executing plugin \"$service\": $!");
               }
           }
           else
           {
               logger ("Plugin \"$service\" exited with status $?. 
--@lines--");
           }
       }
     else {
       if ($child == 0) {
         my $timenow = localtime();
         print "# Child forked as $$ - $timenow\n" if $DEBUG;
         # New process group...
         POSIX::setsid();

         ..
         <child stuff here>
         ..

             print "# Execing $servicedir/$service $command\n" if $DEBUG;
             exec ("$servicedir/$service", $command);

	..

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019