Bonjour,

Rails et daemon ne doivent pas faire bon ménage.

Pour faire tourner des tâches de manière asynchrone dans une application
Ruby on Rails, je te conseille d'utiliser ActiveJob (
http://guides.rubyonrails.org/active_job_basics.html) et Sidekiq.

Bon courage!

-- 
φ <http://pcreux.com>


2016-08-31 16:06 GMT+02:00 ziburudebian <[email protected]>:

> Bonjour à tous
>
> J'utilise la gem *daemon *mais mon programme ne lit pas toutes les
> données de ma table client : il y a 5 enregistrements, il s'arrête au
> deuxième !!! ça fait trois jours que je cherche, j'en peux plus ....
> Voici mon code :
>
> *runexecution *est la fonction que je lance depuis le bouton de mon
> formulaire; elle est décrite dans
> *app/controllers/executions_controller.rb*
>
>   class ExecutionsController < ApplicationController
>
>   def runexecution
>      # ============================================================
> ================================================
>      # DESCRIPTION : Permet de demarrer ou arreter l'execution d'un script
> (action=start ou stop)
>      # ============================================================
> ================================================
>      require 'daemons'
>      # ----------------------------
>      # traitement des parametres
>      # ----------------------------
>      return "" if params.nil? # ce test  permet de ne pas rentrer dans la
> fonction lors de l'appel via le menu
>      action = ""
>      params.each do |key,value|
>         action = "start" if (key.index("loopstart") != nil)
>         action = "stop" if (key.index("loopstop") != nil)
>      end
>      logger.info("******************action="+action)
>      case action
>      when "start"
>         exedate = "2015-10-03 08:30"
>         frequence = "0.05"
> listclientselectionne = "1-2-3-4-5"
>         paramopt = ""
>         options = {:ARGV       => [action, paramopt, '--', exedate,
> frequence, listclientselectionne],
>                    :dir_mode   => :script,
>                    :dir        => 'tmp/pids',
>                    :multiple   => true,
>                    :ontop      => true,
>                    :mode       => :load,
>                    :backtrace  => true,
>                    :monitor    => true,
>                    :log_output => true
>                   }
>         logger.info("******************options="+options.to_s)
>         Daemons.run('myserver.rb', options)
>         logger.info("******************FIN")
>
>      when "stop"
>         logger.info("******************loopstop")
>      else
>        redirect_to executions_execution_path
>      end # case action
>
>   end # runexecution
>
>   end #class
>
> le programme qui tourne en boucle est* myserver.rb* qui est à la racine
> de mon site :
>
> #!/usr/bin/env ruby
> ENV['RAILS_ENV'] ||= 'production'
> require File.expand_path('../config/environment',  __FILE__)
> print "\nParametres= " + ARGV[0].to_s + "****" + ARGV[1] + "****" +
> ARGV[2] + "\n"
> exedate = ARGV[0]
> frequence = ARGV[1]
> listclientselectionne = ARGV[2]
> delai = frequence.to_f * 60
> listclientselectionne = listclientselectionne.split("-")
> print "Nbclient=" + listclientselectionne.count.to_s + "\n"
> loop do
>   print Time.now.to_s + "\n"
>   listclientselectionne.each do |idcl|
>     print idcl + "\n"
>     begin
>       print "avant\n"
>       objclient = Client.find(idcl)
>       print "apres\n"
>       if (!objclient.nil?)
>         print objclient.lastname.to_s + "\n"
>         # print objclient.name + "\n"
>       else
>         print "Erreur sur " + idcl + "\n"
>       end
>     rescue  ActiveRecord::RecordNotFound => e
>       objclient = nil
>       print "Erreur \n"
>     end
>   end
>   sleep(delai)
> end
>
> et voici les résultat à 'écran
>
> => Booting Thin
> => Rails 4.1.7 application starting in production on http://0.0.0.0:3000
> => Run `rails server -h` for more startup options
> => Notice: server is listening on all interfaces (0.0.0.0). Consider using
> 127.0.0.1 (--binding option)
> => Ctrl-C to shutdown server
> Thin web server (v1.6.4 codename Gob Bluth)
> Maximum connections set to 1024
> Listening on 0.0.0.0:3000, CTRL+C to stop
> myserver.rb: process with pid 28318 started.
>
> Parametres= 2015-10-03 08:30****0.05****5-1-6-2
> Nbclient=5
> 2016-08-31 15:47:56 +0200
> 1
> avant
> apres
> DURANTON
> 2
> avant
> apres
> VALENT
> 3
> avant
> log writing failed. closed stream
> log writing failed. closed stream
> log writing failed. closed stream
>
>
> Si j'exécute le programme *myserver.rb* depuis la console avec *ruby
> myserver.rb 1 2 3 : *tout se passe bien; voici le stdout
>
> # ruby myserver.rb 1 2 3
> Parametres= 1****2****3
> Nbclient=5
> 2016-08-31 16:04:10 +0200
> 1
> avant
> apres
> DURANTON888
> 2
> avant
> apres
> VALENT
> 3
> avant
> apres
> VIGILE1AA
> 4
> avant
> apres
> VIGILE2
> 5
> avant
> apres
> DURANDTON
>
>
>
> Si vous avez une idée
>
> Merci beaucoup
>
> *Ma config*
>
>    - Debian GNU/Linux 7
>    - Rails 4.17
>    - Ruby 1.91
>
> --
> --
> Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de
> Google Groups.
> Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse
> [email protected]
> Pour résilier votre abonnement envoyez un e-mail à l'adresse
> [email protected]
> ---
> Vous recevez ce message, car vous êtes abonné au groupe Google Groupes
> "Railsfrance".
> Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le
> concernant, envoyez un e-mail à l'adresse railsfrance+unsubscribe@
> googlegroups.com.
> Pour obtenir davantage d'options, consultez la page
> https://groups.google.com/d/optout.
>

-- 
-- 
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de 
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse 
[email protected]
Pour résilier votre abonnement envoyez un e-mail à l'adresse 
[email protected]
--- 
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes 
Railsfrance.
Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le concernant, 
envoyez un e-mail à l'adresse [email protected].
Pour plus d'options, visitez le site https://groups.google.com/d/optout .

Répondre à