Si tu veux utiliser daemon et rails en meme temps, il faut que tu ecrives
dans une queue intermediaire (par exemple redis). Le daemon monitor la
queue (boucle infinie), quand ya des nouveaux messages dedans, il les
depiles et les traite. Ton controller ne doit jamais inclure la gem daemon
et tu ne dois jamais appeler des scrips depuis ton controller, sinon la gem
daemon ne sert a rien en fait, tu peux appeler le script directement avec
system() et c'est degueulasse.

Quand a ton probleme courant, ce qu'on voit dans ton exemple, c'est que tu
passes tes ids client en mode "1-2-3-4" depuis le controller et en mode "1
2 3" depuis le shell.

Quand au script lui meme, pourquoi lui filer une loop alors que ca sert a
rien? C'est pas daemon, c'est un script shell ca
C'est aussi plus clean de faire un truc genre Client.find(*client_ids).each
{ } plutot que client_ids.each { |id| c = Client.find(id) #... } Dans un
cas t'as un seul call SQL et dans l'autre, t'as autant de calls que d'ids.

Le code de ton daemon est tres confus. On ne demarre pas un daemon depuis
un controller. Le daemon doit tourner tout le temps et recevoir des
signaux. La tu ne controlles pas combien de daemon seront demarres en
parallele. Il suffit de spammer ton serveur pour demarrer des tonnes de
daemon et faire peter l'OS qui sera perdu dans les millions de process
crees par le serveur. Le fait de stopper quand ton utilisateur veut bien
penser a cliquer sur stop (ce qu'il ne fera jamais) me permet de te predire
que tu vas devoir redemarrer tes serveurs souvent, et que ton app ne serait
jamais disponible.

En fait, si tu decrivais ce que tu cherches reellement a faire, ca
permettrait probablement de t'aiguiller un peu mieux. Mais la, le code, y'a
tellement de fondamentaux qui manquent que personne peut prendre le temps
de te donner la solution.

2016-09-01 17:52 GMT+08:00 Philippe Creux <pcr...@gmail.com>:

> 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 <devmap...@gmail.com>:
>
>> 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
>> railsfrance@googlegroups.com
>> Pour résilier votre abonnement envoyez un e-mail à l'adresse
>> railsfrance-unsubscr...@googlegroups.com
>> ---
>> 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@google
>> groups.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
> railsfrance@googlegroups.com
> Pour résilier votre abonnement envoyez un e-mail à l'adresse
> railsfrance-unsubscr...@googlegroups.com
> ---
> 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@google
> groups.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 
railsfrance@googlegroups.com
Pour résilier votre abonnement envoyez un e-mail à l'adresse 
railsfrance-unsubscr...@googlegroups.com
--- 
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+unsubscr...@googlegroups.com.
Pour plus d'options, visitez le site https://groups.google.com/d/optout .

Répondre à