Gemme pratique "à tout moment" qui vous permet d'écrire facilement le traitement planifié
Lors de la création d'une application avec docker, j'ai essayé de traiter à chaque fois, mais j'ai trébuché, donc je vais l'écrire sous forme de mémorandum.
Ruby 2.5.1 Rails 5.2.4.3
Cette fois, préparez un modèle appelé post et utilisez-le à chaque minute pour créer un post chaque minute. Commencez comme si la construction de l'environnement docker était terminée.
Sur docker
root@6181bdf78fa7:/myapp# bundle exec rails g model post name:string
root@6181bdf78fa7:/myapp# bundle exec db:migrate
root@6181bdf78fa7:/myapp# bundle exec rails g controller posts
Installez d'abord la gemme
Gemfile
gem 'whenever', require: false
Après avoir reconstruit et installé le gem, exécutez la commande pour créer un fichier
root@6181bdf78fa7:/myapp# bundle exec wheneverize .
[add] writing `./config/schedule.rb'
[done] wheneverized!
Nous traiterons le schedule.rb créé.
schedule.rb
require File.expand_path(File.dirname(__FILE__) + "/environment")
set :environment, :development
set :output, 'log/cron.log'
ENV.each { |k, v| env(k, v) }
every 1.minutes do
runner "Post.create"
end
Lorsque vous atteignez ce point, reflétez les paramètres dans cron
root@6181bdf78fa7:/myapp# bundle exec whenever --update-crontab
bundler: failed to load command: whenever (/usr/local/bundle/bin/whenever)
Errno::ENOENT: No such file or directory - crontab
/usr/local/bundle/gems/whenever-1.0.0/lib/whenever/command_line.rb:77:in `popen'
/usr/local/bundle/gems/whenever-1.0.0/lib/whenever/command_line.rb:77:in `write_crontab'
/usr/local/bundle/gems/whenever-1.0.0/lib/whenever/command_line.rb:38:in `run'
/usr/local/bundle/gems/whenever-1.0.0/lib/whenever/command_line.rb:6:in `execute'
/usr/local/bundle/gems/whenever-1.0.0/bin/whenever:44:in `<top (required)>'
/usr/local/bundle/bin/whenever:23:in `load'
/usr/local/bundle/bin/whenever:23:in `<top (required)>'
Vous avez une erreur. En tant que débutant cron, je suis tombé ici.
Apparemment, je dois installer cron dans l'environnement docker, alors décrivez le traitement requis pour l'installation dans le fichier docker. Cette fois, j'ai ajouté une ligne comme celle-ci.
FROM ruby:2.5.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN apt-get install -y cron #Ajouter cette ligne
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
root@6710f08a3504:/myapp# bundle exec whenever --update-crontab
[write] crontab file updated
Il a été mis à jour avec succès et reflété dans cron. Je pense que le traitement automatique a commencé, alors j'attendrai un peu ...
… Apparemment, ça ne marche pas. Si chaque fois fonctionne, clog / cron.log doit être créé.
Vérifiez l'état car cron n'est pas en cours d'exécution.
root@827fe138767f:/myapp# service cron status
[FAIL] cron is not running ... failed!
Après tout, cela ne fonctionnait pas. Commençons.
root@827fe138767f:/myapp# service cron start
[ ok ] Starting periodic command scheduler: cron.
1 minute plus tard ...
cron.log
Running via Spring preloader in process 122
Enfin, cron.log a été généré et le journal a été écrit. Vérifiez auprès de la console des rails.
root@827fe138767f:/myapp# bundle exec rails c
Running via Spring preloader in process 135
Loading development environment (Rails 5.2.4.3)
irb(main):001:0> Post.all.count
(4.5ms) SELECT COUNT(*) FROM "posts"
=> 1
Vous pouvez voir que les données ont été générées!
Cependant, il est difficile de démarrer cron manuellement à chaque fois, donc si possible, j'aimerais le décrire dans le fichier docker afin qu'il démarre automatiquement. Je pense que j'ajouterai la méthode à l'avenir.
Recommended Posts