Merci florian pour tes explications, c'est vrai que fournir du code ainsi peut paraître complexe, mais au bout d'un moment tout seul dans mon coin à coder, je craque... tu as raison, j'aurai du commencer par expliquer ce que je veux faire :
sur mon formulaire j'ai 2 boutons START et STOP comme tu l'as compris dans mon code; le but lorsque je clique sur START est de lancer un programme qui à partir d'options choisies sur ma page web, analyse les données dans la base et affiche le résultat sur ma page web et le STOP arrête cette analyse; les données (que j'analyse) qui alimente ma base sont mises à jour par un programme externe toutes les 10 minutes, c'est pour cela que j'ai pensé à un boucle infinie qui démarre sur le bouton START Le jeudi 1 septembre 2016 19:14:26 UTC+2, Florian Dutey a écrit : > > 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 <javascript:>> > : > >> 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 <devm...@gmail.com <javascript:>> >> : >> >>> 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 >>> rails...@googlegroups.com <javascript:> >>> Pour résilier votre abonnement envoyez un e-mail à l'adresse >>> railsfrance...@googlegroups.com <javascript:> >>> --- >>> 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...@googlegroups.com <javascript:>. >>> 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 >> rails...@googlegroups.com <javascript:> >> Pour résilier votre abonnement envoyez un e-mail à l'adresse >> railsfrance...@googlegroups.com <javascript:> >> --- >> 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...@googlegroups.com >> <javascript:>. >> 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 .