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 .

Répondre à