POE lamenta che metodo run di POE :: kernel non è mai stato chiamato quando il fork

StackOverflow https://stackoverflow.com/questions/4571307

  •  14-10-2019
  •  | 
  •  

Domanda

Questo è il mio codice:

 if ($DAEMON) {
                my $pid = fork();
                if (not defined $pid) {
                                        print "Unable to start daemon.\n";
                                        exit(1);
                                      }
                elsif ($pid == 0) {
                                   open STDOUT, '>', '/dev/null';
                                   open STDERR, '>', '/dev/null';
                                   _create_sessions($self, $settings);
                                   $poe_kernel->run;
                                  }
                else { print "Script forked to background with PID $pid\n"; }
              }
 else {
        _create_sessions($self, $settings);
        $poe_kernel->run;
      }

Quando $ DAEMON = 1, si lamenta che il metodo run di POE :: Kernel () non è mai stato chiamato, ma come si può vedere nel codice di cui sopra, ho fatto già. Lo script funziona perfettamente bene quando in modalità demone, ma non può sbarazzarsi di tale avviso o capire il motivo per cui si dice che. Ho anche provato a chiamare $ poe_kernel-> has_forked () e che non ha fatto la differenza sia.

Sono a corto di idee. Qualche suggerimento?

Aggiornamento per aggiungere : Forse non sono stato abbastanza chiaro. Il seguente codice crea la sessione ed esegue il kernel.

_create_sessions($self, $settings);
$poe_kernel->run;

Funziona perfettamente bene. E 'solo quando lo stesso codice viene eseguito all'interno di un bambino fork'd così posso mandare lo script per lo sfondo, che si dice metodo run di POE :: kernel non è stato chiamato. Lo script fa andare in secondo piano e funziona come dovrebbe, che significa che il kernel è infatti in esecuzione. Sto solo cercando di sbarazzarsi di tale avviso fastidioso.

È stato utile?

Soluzione

ysth è giusto. L'avvertimento avviene perché le istanze POE :: sessione vengono creati nel processo padre ma non hanno avuto la possibilità di correre.

% perl -wle 'use POE; POE::Session->create(inline_states=>{_start => sub {}})'
40023: Sessions were started, but POE::Kernel's run() method was never
40023: called to execute them.  This usually happens because an error
40023: occurred before POE::Kernel->run() could be called.  Please fix
40023: any errors above this notice, and be sure that POE::Kernel->run()
40023: is called.  See documentation for POE::Kernel's run() method for
40023: another way to disable this warning.

Nell'esempio precedente, 40023 è l'ID di processo in cui è stato rilevato il problema.

E 'simile agli avvisi di Perl su uscire con thread attivi:

% perl -wle 'use threads; threads->create(sub { sleep 3600 }); '
Perl exited with active threads:
  1 running and unjoined
  0 finished and unjoined
  0 running and detached

Mentre il frammento di codice sessioni spettacoli sono creati ed eseguiti nel processo figlio, ho sessioni sospette vengono creati prima o dopo. Il processo genitore non esce nel tuo snippet, quindi non si può dire se l'esecuzione va dopo?

Si dovrebbe anche chiamare POE :: kernel-> has_forked () nel processo figlio. Non posso dire se quello che sta succedendo nel snippet di codice.

La soluzione corretta è quella di spostare tutti esemplificazione sessione nel processo figlio quando daemonizing. Una soluzione praticabile è quella di chiamare POE :: kernel-> run () solo dopo aver utilizzato POE :: Kernel e prima che le sessioni sono effettivamente creati. run () restituirà immediatamente perché non esistono le sessioni, ma i soddisfa la condizione di chiamata sei stato avvertito circa. E 'un modo di dire "sì, sì, ma so quello che sto facendo".

Altri suggerimenti

Dal documento, corsa di POE :: kernel è normalmente chiamato come metodo di classe; ciò che è di $ poe_kernel?

Da qualche parte, ti sembra di essere di iniziare una sessione, ma non si finisce per chiamare POE :: kernel-> run ();

Aggiornamento: dal momento che il messaggio che si vede è uscita con in guardia, e si sta gettando via STDERR nel bambino, sto cercando di indovinare che è il genitore che dà l'avvertimento. Qualcosa che si stanno facendo (nel codice che non mostrano che i carichi POE e set $ poe_kernel?) È infatti la creazione di una sessione, a quanto pare involontariamente.

Cercare di ridurre il codice per un breve, ma ad esempio eseguibile e si sia trovare il problema da soli o consentire ad altri di aiuto a trovarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top