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 .