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 <[email protected] <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 <[email protected] <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
>>> [email protected] <javascript:>
>>> Pour résilier votre abonnement envoyez un e-mail à l'adresse
>>> [email protected] <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
>>> [email protected] <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
>> [email protected] <javascript:>
>> Pour résilier votre abonnement envoyez un e-mail à l'adresse
>> [email protected] <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 [email protected]
>> <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
[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 .