Apa cara terbaik untuk menjalankan tugas yang dijadwalkan di lingkungan Rails? Script / pelari? Menyapu? Saya ingin menjalankan tugas setiap beberapa menit.
Apa cara terbaik untuk menjalankan tugas yang dijadwalkan di lingkungan Rails? Script / pelari? Menyapu? Saya ingin menjalankan tugas setiap beberapa menit.
Jawaban:
Saya menggunakan pendekatan rake (didukung oleh heroku )
Dengan file yang disebut lib / tugas / cron.rake ..
task :cron => :environment do
puts "Pulling new requests..."
EdiListener.process_new_messages
puts "done."
end
Untuk mengeksekusi dari baris perintah, ini hanya "rake cron". Perintah ini kemudian dapat diletakkan di sistem operasi cron / task scheduler seperti yang diinginkan.
Perbarui ini pertanyaan dan jawaban yang cukup lama! Beberapa info baru:
load "#{Rails.root}/lib/tasks/cron.rake"
dan rake cron
, tetapi mendapat NameError: variabel lokal tidak terdefinisi atau metode `cron 'untuk main: Object
:environment
ketergantungan. Kami memiliki aplikasi Rail yang sangat berat yang membutuhkan waktu lama untuk memulai, Rake kami dipanggil setiap menit dan menghabiskan lebih banyak sumber daya memulai lingkungan Rails yang menjalankan tugas . Saya ingin memiliki lingkungan Rails yang sudah dimulai untuk dipanggil melalui cron, harus ada sesuatu antara pendekatan controller dan lingkungan rake .
Saya telah menggunakan Kapanpun sangat populer pada proyek yang sangat bergantung pada tugas yang dijadwalkan, dan itu bagus. Ini memberi Anda DSL yang bagus untuk mendefinisikan tugas terjadwal Anda daripada harus berurusan dengan format crontab. Dari README:
Kapan saja adalah permata Ruby yang menyediakan sintaks yang jelas untuk menulis dan menggunakan pekerjaan cron.
Contoh dari README:
every 3.hours do
runner "MyModel.some_process"
rake "my:rake:task"
command "/usr/bin/my_great_command"
end
every 1.day, :at => '4:30 am' do
runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end
Dalam proyek kami, kami pertama kali menggunakan setiap kali permata, tetapi menghadapi beberapa masalah.
Kami kemudian beralih ke permata RUFUS SCHEDULER , yang ternyata sangat mudah dan dapat diandalkan untuk menjadwalkan tugas di Rails.
Kami telah menggunakannya untuk mengirim surat mingguan & harian, dan bahkan untuk menjalankan beberapa tugas menyapu periodik atau metode apa pun.
Kode yang digunakan dalam ini adalah seperti:
require 'rufus-scheduler'
scheduler = Rufus::Scheduler.new
scheduler.in '10d' do
# do something in 10 days
end
scheduler.at '2030/12/12 23:30:00' do
# do something at a given point in time
end
scheduler.every '3h' do
# do something every 3 hours
end
scheduler.cron '5 0 * * *' do
# do something every day, five minutes after midnight
# (see "man 5 crontab" in your terminal)
end
Untuk mempelajari lebih lanjut: https://github.com/jmettraux/rufus-scheduler
Dengan asumsi tugas Anda tidak terlalu lama untuk diselesaikan, cukup buat pengontrol baru dengan aksi untuk setiap tugas. Menerapkan logika tugas sebagai kode pengontrol, Kemudian mengatur tugas cronjob di tingkat OS yang menggunakan wget untuk memohon URL pengontrol ini dan bertindak pada interval waktu yang sesuai. Kelebihan dari metode ini adalah Anda:
skrip / pelari dan tugas menyapu sangat baik untuk dijalankan sebagai pekerjaan cron.
Inilah satu hal yang sangat penting yang harus Anda ingat ketika menjalankan pekerjaan cron. Mereka mungkin tidak akan dipanggil dari direktori root aplikasi Anda. Ini berarti semua kebutuhan Anda untuk file (sebagai lawan dari perpustakaan) harus dilakukan dengan jalur eksplisit: mis. File.dirname (__ FILE__) + "/ other_file". Ini juga berarti Anda harus tahu cara memanggil mereka secara eksplisit dari direktori lain :-)
Periksa apakah kode Anda mendukung dijalankan dari direktori lain dengan
# from ~
/path/to/ruby /path/to/app/script/runner -e development "MyClass.class_method"
/path/to/ruby /path/to/rake -f /path/to/app/Rakefile rake:task RAILS_ENV=development
Juga, pekerjaan cron mungkin tidak berjalan seperti Anda, jadi jangan bergantung pada pintasan apa pun yang Anda masukkan .bashrc. Tapi itu hanya tip cron standar ;-)
Masalah dengan kapan saja (dan cron) adalah bahwa reload lingkungan rel setiap kali dieksekusi, yang merupakan masalah nyata ketika tugas Anda sering atau memiliki banyak pekerjaan inisialisasi yang harus dilakukan. Saya punya masalah dalam produksi karena ini dan harus memperingatkan Anda.
Penjadwal Rufus melakukannya untuk saya ( https://github.com/jmettraux/rufus-scheduler )
Ketika saya memiliki pekerjaan yang panjang untuk dijalankan, saya menggunakannya dengan menunda_job ( https://github.com/collectiveidea/delayed_job )
Saya harap ini membantu!
Saya penggemar berat resque / scheduler resque . Anda tidak hanya dapat menjalankan tugas yang mirip cron tetapi juga tugas pada waktu tertentu. Kelemahannya, ini membutuhkan server Redis.
Yang menarik tidak ada yang menyebut Sidetiq . Ini adalah tambahan yang bagus jika Anda sudah menggunakan Sidekiq.
Sidetiq menyediakan API sederhana untuk mendefinisikan pekerja berulang untuk Sidekiq.
Pekerjaan akan terlihat seperti ini:
class MyWorker
include Sidekiq::Worker
include Sidetiq::Schedulable
recurrence { hourly.minute_of_hour(15, 45) }
def perform
# do stuff ...
end
end
Keduanya akan bekerja dengan baik. Saya biasanya menggunakan script / runner.
Ini sebuah contoh:
0 6 * * * cd /var/www/apps/your_app/current; ./script/runner --environment production 'EmailSubscription.send_email_subscriptions' >> /var/www/apps/your_app/shared/log/send_email_subscriptions.log 2>&1
Anda juga dapat menulis skrip Ruby murni untuk melakukan ini jika Anda memuat file konfigurasi yang tepat untuk terhubung ke database Anda.
Satu hal yang perlu diingat jika memori berharga adalah bahwa skrip / pelari (atau tugas Rake yang bergantung pada 'lingkungan') akan memuat seluruh lingkungan Rails. Jika Anda hanya perlu memasukkan beberapa catatan ke dalam basis data, ini akan menggunakan memori yang tidak harus Anda miliki. Jika Anda menulis skrip Anda sendiri, Anda dapat menghindari ini. Saya belum benar-benar perlu melakukan ini, tetapi saya sedang mempertimbangkannya.
Gunakan Craken (pekerjaan cron centric cron)
Saya menggunakan backgroundrb.
http://backgroundrb.rubyforge.org/
Saya menggunakannya untuk menjalankan tugas yang dijadwalkan serta tugas yang terlalu lama untuk hubungan klien / server normal.
Inilah cara saya mengatur tugas cron saya. Saya punya satu untuk membuat cadangan harian dari database SQL (menggunakan menyapu) dan yang lain untuk berakhir cache sekali sebulan. Output apa pun dicatat dalam log file / cron_log. Crontab saya terlihat seperti ini:
crontab -l # command to print all cron tasks
crontab -e # command to edit/add cron tasks
# Contents of crontab
0 1 * * * cd /home/lenart/izziv. whiskas.si/current; /bin/sh cron_tasks >> log/cron_log 2>&1
0 0 1 * * cd /home/lenart/izziv.whiskas.si/current; /usr/bin/env /usr/local/bin/ruby script/runner -e production lib/monthly_cron.rb >> log/cron_log 2>&1
Tugas cron pertama membuat backup db harian. Isi cron_tasks adalah sebagai berikut:
/usr/local/bin/rake db:backup RAILS_ENV=production; date; echo "END OF OUTPUT ----";
Tugas kedua adalah setup kemudian dan menggunakan script / runner untuk kedaluwarsa cache sebulan sekali (lib / Monthly_cron.rb):
#!/usr/local/bin/ruby
# Expire challenge cache
Challenge.force_expire_cache
puts "Expired cache for Challenges (Challenge.force_expire_cache) #{Time.now}"
Saya kira saya bisa membuat cadangan basis data dengan cara lain tetapi sejauh ini berfungsi untuk saya :)
The jalur untuk meraup dan ruby dapat bervariasi pada server yang berbeda. Anda dapat melihat di mana mereka berada dengan menggunakan:
whereis ruby # -> ruby: /usr/local/bin/ruby
whereis rake # -> rake: /usr/local/bin/rake
Menggunakan sesuatu Sidekiq atau Resque adalah solusi yang jauh lebih kuat. Keduanya mendukung pengerjaan ulang pekerjaan, eksklusivitas dengan kunci REDIS, pemantauan, dan penjadwalan.
Perlu diingat bahwa Resque adalah proyek mati (tidak dipelihara secara aktif), jadi Sidekiq adalah alternatif yang jauh lebih baik. Ini juga lebih performant: Sidekiq menjalankan beberapa pekerja pada satu proses, multithread sementara Resque menjalankan setiap pekerja dalam proses terpisah.
Saya baru-baru ini menciptakan beberapa pekerjaan cron untuk proyek yang telah saya kerjakan.
Saya menemukan bahwa Clockwork permata sangat berguna.
require 'clockwork'
module Clockwork
every(10.seconds, 'frequent.job')
end
Anda bahkan dapat menjadwalkan pekerjaan latar belakang Anda menggunakan permata ini. Untuk dokumentasi dan bantuan lebih lanjut lihat https://github.com/Rykian/clockwork
Anda dapat menggunakan resque
dan resque-schedular
membuat permata untuk membuat cron, ini sangat mudah dilakukan.
Pernah saya harus membuat keputusan yang sama dan saya sangat senang dengan keputusan itu hari ini. Gunakan penjadwal ulang karena tidak hanya redis yang terpisah akan mengeluarkan beban dari db Anda, Anda juga akan memiliki akses ke banyak plugin seperti resque-web yang menyediakan antarmuka pengguna yang hebat. Ketika sistem Anda berkembang, Anda akan memiliki lebih banyak tugas yang dijadwalkan sehingga Anda dapat mengendalikannya dari satu tempat.
Mungkin cara terbaik untuk melakukannya adalah menggunakan rake untuk menulis tugas yang Anda butuhkan dan jalankan saja melalui baris perintah.
Anda dapat melihat video yang sangat membantu di railscasts
Lihat juga sumber daya lain ini:
Saya tidak begitu yakin, saya kira itu tergantung pada tugas: seberapa sering menjalankan, seberapa rumit dan seberapa banyak komunikasi langsung dengan proyek kereta diperlukan dll. Saya kira jika hanya ada "Satu Cara Terbaik" untuk melakukan sesuatu , tidak akan ada begitu banyak cara untuk melakukannya.
Pada pekerjaan terakhir saya di proyek Rails, kami perlu membuat mailer undangan batch (undangan survei, bukan spam) yang akan mengirim email yang direncanakan kapan pun server punya waktu. Saya pikir kami akan menggunakan alat daemon untuk menjalankan tugas menyapu yang telah saya buat.
Sayangnya, perusahaan kami memiliki beberapa masalah uang dan "dibeli" oleh saingan utama sehingga proyek itu tidak pernah selesai, jadi saya tidak tahu apa yang akhirnya akan kami gunakan.
Saya Menggunakan skrip untuk menjalankan cron, itu adalah cara terbaik untuk menjalankan cron. Berikut ini beberapa contoh untuk cron,
Buka CronTab -> sudo crontab -e
Dan tempelkan garis di bawah:
00 00 * * * wget https: // your_host / some_API_end_point
Berikut ini beberapa format cron, akan membantu Anda
::CRON FORMAT::
Examples Of crontab Entries
15 6 2 1 * /home/melissa/backup.sh
Run the shell script /home/melissa/backup.sh on January 2 at 6:15 A.M.
15 06 02 Jan * /home/melissa/backup.sh
Same as the above entry. Zeroes can be added at the beginning of a number for legibility, without changing their value.
0 9-18 * * * /home/carl/hourly-archive.sh
Run /home/carl/hourly-archive.sh every hour, on the hour, from 9 A.M. through 6 P.M., every day.
0 9,18 * * Mon /home/wendy/script.sh
Run /home/wendy/script.sh every Monday, at 9 A.M. and 6 P.M.
30 22 * * Mon,Tue,Wed,Thu,Fri /usr/local/bin/backup
Run /usr/local/bin/backup at 10:30 P.M., every weekday.
Semoga ini bisa membantu Anda :)