2017-03-15 2 views
0

Ich benutze Symfony 3 Framework mit PHEANSTALK PHP-Bibliothek. Ich betreibe die App auf dem Server mit Linux Debian Jesse. Die Job-Erstellung funktioniert einwandfrei und wenn der Worker vom Terminal ausgeführt wird, funktioniert es wie es sollte. Aber als ich den Befehl zu crontab hinzugefügt habe, sehe ich, dass der Befehl nicht funktioniert. Es gibt kein Login in/var/main/user, um mir beim Debuggen zu helfen. Ich werde mich sehr für jede Hilfe freuen.Crontab nicht den PHP-Befehl ausführen

Das ist mein Arbeiter-Befehl (nur die Funktion ausführen):

protected function execute(InputInterface $input, OutputInterface $output) 
{ 
    $output->writeln("\n<info>Beanstalk worker service started</info>"); 
    $tubes = $this->getContainer()->get('app.job_manager.power_plant')->getTubes(); 
    if ($input->getOption('one-check')) { 
     // run once 
     foreach ($tubes as $tubeName) { 
      if ($tubeName != "default") { 
       $this->getContainer()->get('app.queue_manager')->fetchQueue($tubeName); 
      } 
     } 
     $output->writeln("\n<info>Beanstalk worker completed check and stoped</info>"); 
    } else { 
     // run forever 
     set_time_limit(0); 
     max_execution_time(0); 
     while (1) { 
      foreach ($tubes as $tubeName) { 
       if ($tubeName != "default") { 
        $this->getContainer()->get('app.queue_manager')->fetchQueue($tubeName); 
       } 
      } 
     } 
     $output->writeln("\n<info>Beanstalk worker stoped</info>"); 
    } 
} 

Dies ist meine app.queue_manager Funktion Job aus der Warteschlange zu erhalten und Befehl ausführen:

public function fetchQueue($tubeName) 
{ 
    if ($this->pheanstalk->getConnection()->isServiceListening()) { 
     while (true === is_object($job = $this->pheanstalk->watch($tubeName)->ignore('default')->reserve(self::WATCH_TIMEOUT))) { 
      $data = json_decode($job->getData(), true); 
      $this->worker($data); 
      $this->pheanstalk->delete($job); 
     } 
    } 
} 

Und der Arbeiter zum Ausführen Befehl

public function worker($data) 
{ 
    $application = new Application($this->kernel); 
    $application->setAutoExit(false); 

    $parameters = []; 
    $parameters['command'] = $data['command']; 
    foreach ($data['meta'] as $key => $param) { 
     $parameters[$key] = $param; 
    } 

    $input = new ArrayInput($parameters); 
    $output = new NullOutput(); 

    return $application->run($input, $output); 
} 

Das ist meine crontab, die nicht funktionieren:

@reboot /usr/bin/php /var/www/mose-base/bin/console beanstalk:worker:start 

ich eine andere cron Tab erstellt, die ok funktioniert. Es funktioniert alle 15 Minuten, und der Unterschied ist, dass keine Endlosschleife (während (1)), so dass es nur einmal durch Röhren und dann fertig ist. Aber es ist nicht was ich will. Ich mag unendliche Schleife, die die ganze Zeit funktioniert, wie ich es mit dem ersten crontab erstellt:

*/15 * * * * /usr/bin/php /var/www/mose-base/bin/console beanstalk:worker:start --one-check 
+0

Setzen Sie den Job-Start in etwas anderes - wie rc.local. Von dem, was ich lese, passiert der @ Reboot nur bei einem Neustart, nicht eine vollständige Abschaltung. – FreudianSlip

+0

Ich habe das auch versucht. Aber es ist dasselbe. Ich sehe, dass das Kommando mit ps -eLf läuft, aber der Befehl läuft nicht, weil die Jobs nicht gelöscht und ausgeführt werden ... – sanof

+0

Scheitert das Programm, weil es keinen "Eingabe" -Stream gibt - d. H. Keine Konsole zum Öffnen/Lesen von? – FreudianSlip

Antwort

0

I rc.local verwendet berichten. Es löst das Problem. Tnx FreudianSlip

0

Wenn es in der Konsole arbeitet, ist es nicht für die Datei Benutzerberechtigungen arbeiten. Prüfen Sie.

Sie können Fehler per E-Mail mit diesem Job

*/15 * * * * /usr/bin/php /var/www/mose-base/bin/console beanstalk:worker:start --one-check 2>&1 | mail -s "mysql_dump" [email protected]