[SP-pm] forks + daemon + socket

Jorge Teles jorteles at yahoo.com
Fri Nov 27 05:34:08 PST 2009


Posso estar falando uma tremenda besteira, mas não seria interessante se trocasse a porta 1 para algo como 50001. 
Se não me engano no linux a porta 1 é alocada para /sbin/init. Basta dar um ps e verás! :)

Abraços,



________________________________
From: Andre Carneiro <andregarciacarneiro em gmail.com>
To: saopaulo-pm em mail.pm.org
Sent: Fri, November 27, 2009 9:06:38 AM
Subject: [SP-pm] forks + daemon + socket

Salve pessoal!


Estou tendo um problema utilizando o módulo forks.

Enquanto eu não faço o 'daemonize' no meu daemon, funciona tudo blz. No entanto, quando o 'daemonize' acontece, tudo que é executado através de forks gera "conexão recusada" no socket. 

<code>
.
.
.
use App::Daemon qw( daemonize );
use POSIX qw(:signal_h );
use Getopt::Long;
use IO::Socket::UNIX;

#DAEMON
    my $SOCKFILE    = '/tmp/socktest';
    unlink $SOCKFILE or die $! if -e $SOCKFILE;
    daemonize() if $daemonize == 1;
    my $usock = IO::Socket::UNIX->new(    Type     => SOCK_STREAM ,
                        Local    => '/tmp/socktest' ,
                        Listen    => 1
                    ) or die $!;
    my $r = ();
    chmod 0777 , $SOCKFILE;
    my %Process;

    while(1){
        if(my ($r) = $usock->accept){
                       #c

        }else{
              die "\nSOCKET NAO FOI ACEITO!!! $! $@\n";
        }
    }


</code>
#cliente
.
.
.
use IO::Socket::UNIX;
use Getopt::Std;
use Config::General;
use Data::Dumper;

my $conf_obj    = Config::General->new('config/general.conf');
my %config    = $conf_obj->getall();
my $SOCKETFILE     = '/tmp/socktest';#$config{defaults}->{scap_socket}; 

@ARGV < 1 and die "Parametros invalidos\n";

my $usock = new IO::Socket::UNIX(
    Type  => SOCK_STREAM,
    Peer => $SOCKETFILE,
) or die "Impossivel abrir Socket: $! $@ em " . $SOCKETFILE;



my %args;
getopts("r:s:p:", \%args);
if($args{r}) {
    print "Executar Spider $args{r} $args{p}\n";
    print $usock "run $args{r} $args{p}" or die $!;
}
elsif($args{s}) {
    print "Parar Spider $args{s}\n";
    print $usock "stop $args{s}";
}


O cliente acima instancia uma classe que executa o seguinte trecho de código abaixo...


<code>
.
.
.

use forks;
use MooseX::Singleton;
use Config::General;
.
.
.

foreach my $t(@{$thread}){ 
                $self->log_spider->write("debug","Thread $i");
                eval{$Threads[$i] = threads->create('init_thread',$self,$t,$cf)}; 
                if($@){
                    $self->log_spider->write("error","Erro ao criar Thread $i: $@ $!");
                    exit(0);

                }else {
                    $self->stat->dbic($conns->[$i]); #setando a conex?o do pool de conex?es.
                    $i++;
                }
            }
            foreach my $t (1..$#Threads) {$Threads[$t]->join;}
.
.
.
.

sub init_thread {
    my ($self,$thread) = @_;
            #várias ações aqui...
            sleep 1;
}


</code>



Quando a coisa toda é executada, o que ocorre é isso:


<trecho do log>


[Thu Nov 26 18:57:16 2009] [SCAP2] [debug] Thread 1
[Thu Nov 26 18:57:17 2009] [SCAP2] [error] Erro ao criar Thread 1:  (13981): Couldn't connect to query server: IO::Socket::INET: connect: Conex�o recusada at /usr/local/lib/perl/5.10.0/forks.pm line 3592
        threads::_croak('Couldn\'t connect to query server: IO::Socket::INET: connect:...') called at /usr/local/lib/perl/5.10.0/forks.pm line 2113
        threads::_init_thread('HASH(0x98d7f50)', '', undef, undef) called at /usr/local/lib/perl/5.10.0/forks.pm line 761
        threads::new('threads', 'init_thread', 'Spider=HASH(0xaa1af10)', 'HASH(0xaa6e980)', 'HASH(0xa8fdc30)') called at /home/andre/git/scap/lib/Spider.pm line 264
        eval {...} called at /home/andre/git/scap/lib/Spider.pm line 264
        Spider::load_sources('Spider=HASH(0xaa1af10)', 'ARRAY(0xaa6e920)', 'HASH(0xa8fdc30)', 'HASH(0xaa6e120)') called at /home/andre/git/scap/lib/Spider.pm line 123
        Spider::start('Spider=HASH(0xaa1af10)') called at ./scap2d line 251
        main::run('ARRAY(0xa9e1bb8)', 'Spider=HASH(0xaa1af10)') called at ./scap2d line 148
        main::start('Getopt::Long::CallBack=HASH(0xa9f0650)', 1) called at /usr/share/perl/5.10/Getopt/Long.pm line 593
        eval {...} called at /usr/share/perl/5.10/Getopt/Long.pm line 592
        Getopt::Long::GetOptionsFromArray('ARRAY(0x8c5c420)', 'start', 'CODE(0xa9de550)', 'stop', 'CODE(0xa9e21b8)', 'restart', 'CODE(0x90efa48)', 'help', 'CODE(0x90efa48)', ...) called at ./scap2d line 72
 Conex�o recusada
[Thu Nov 26 18:57:17 2009] [SCAP2] [debug] Thread 2
[Thu Nov 26 18:57:17 2009] [SCAP2] [debug] Thread 3
[Thu Nov 26 18:57:17 2009] [SCAP2] [error] Erro ao criar Thread 2:  (13982): Couldn't connect to query server: IO::Socket::INET: connect: Conex�o recusada at /usr/local/lib/perl/5.10.0/forks.pm line 3592
        threads::_croak('Couldn\'t connect to query server: IO::Socket::INET: connect:...') called at /usr/local/lib/perl/5.10.0/forks.pm line 2113
        threads::_init_thread('HASH(0xad41528)', '', undef, undef) called at /usr/local/lib/perl/5.10.0/forks.pm line 761
        threads::new('threads', 'init_thread', 'Spider=HASH(0xaa1af10)', 'HASH(0xaa6e910)', 'HASH(0xa8fdc30)') called at /home/andre/git/scap/lib/Spider.pm line 264
        eval {...} called at /home/andre/git/scap/lib/Spider.pm line 264
        Spider::load_sources('Spider=HASH(0xaa1af10)', 'ARRAY(0xaa6e920)', 'HASH(0xa8fdc30)', 'HASH(0xaa6e120)') called at /home/andre/git/scap/lib/Spider.pm line 123
        Spider::start('Spider=HASH(0xaa1af10)') called at ./scap2d line 251
        main::run('ARRAY(0xa9e1bb8)', 'Spider=HASH(0xaa1af10)') called at ./scap2d line 148
        main::start('Getopt::Long::CallBack=HASH(0xa9f0650)', 1) called at /usr/share/perl/5.10/Getopt/Long.pm line 593
        eval {...} called at /usr/share/perl/5.10/Getopt/Long.pm line 592
        Getopt::Long::GetOptionsFromArray('ARRAY(0x8c5c420)', 'start', 'CODE(0xa9de550)', 'stop', 'CODE(0xa9e21b8)', 'restart', 'CODE(0x90efa48)', 'help', 'CODE(0x90efa48)', ...) called at ./scap2d line 72
 Conex�o recusada



</trecho do log>



Alguém já passou por isso?



Cheers!



-- 
André Garcia Carneiro
Analista/Desenvolvedor Perl


      
-------------- Pr�xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20091127/fdceca4d/attachment.html>


More information about the SaoPaulo-pm mailing list