Я использую метод грабли (поддерживается heroku )
С файлом lib / tasks / cron.rake ..
task :cron => :environment do
puts "Pulling new requests..."
EdiListener.process_new_messages
puts "done."
end
Выполнить из командной строки это просто "rake cron". Затем эту команду можно при желании поместить в cron / планировщик задач операционной системы.
Обновление это довольно старый вопрос и ответ! Некоторая новая информация:
Я не действительно уверен, я предполагаю, что это зависит от задачи: как часто работать, насколько сложный и сколько прямой связи с проектом направляющих необходимо и т.д. Я предполагаю, было ли всего "Один Лучший способ" , чтобы сделать что-то, не было бы такого количества различных способов сделать это.
В моем последнем задании в проекте направляющих, мы должны были сделать пакетную почтовую программу приглашения (приглашения для участия в опросе, не посылая спам), который должен отправить запланированные письма каждый раз, когда сервер имел время. Я думаю, что мы собирались использовать инструменты демона для выполнения задач граблей, которые я создал.
, К сожалению, наша компания имела некоторые проблемы с деньгами и была "куплена" основным конкурентом, таким образом, проект никогда не завершался, таким образом, я не знаю то, что мы в конечном счете использовали бы.
Вот то, как я имею, устанавливают мои задачи крона. У меня есть для создания ежедневных резервных копий базы данных SQL (использующий грабли) и другой для истечения кэша один раз в месяц. Любой вывод зарегистрирован файл log/cron_log. Мой crontab похож на это:
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
первая задача крона делает ежедневные резервные копии дб. Содержание cron_tasks следующее:
/usr/local/bin/rake db:backup RAILS_ENV=production; date; echo "END OF OUTPUT ----";
второй задачей была установка позже и сценарий/бегун использования для истечения кэша один раз в месяц (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}"
я предполагаю, что мог скопировать базу данных некоторый другой путь, но до сих пор это работает на меня :)
, пути для обстрела и рубин могут варьироваться на различных серверах. Вы видите, где они при помощи:
whereis ruby # -> ruby: /usr/local/bin/ruby
whereis rake # -> rake: /usr/local/bin/rake
Я использую backgroundrb.
http://backgroundrb.rubyforge.org/
я использую его для выполнения запланированных задач, а также задач, которые занимают слишком много времени у нормальных клиент-серверных отношений.
Оба будут хорошо работать. Я обычно использую сценарий/бегуна.
Вот пример:
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
можно также записать сценарий чистого Ruby, чтобы сделать это при загрузке правильных файлов конфигурации для соединения с базой данных.
Одна вещь иметь в виду, драгоценна ли память, состоит в том, что сценарий/бегун (или задача Граблей, которая зависит от 'среды') загрузит всю среду направляющих. Если только необходимо вставить некоторые записи в базу данных, это будет использовать память, к которой Вы действительно не имеете. Если Вы пишете свой собственный сценарий, можно избежать этого. Я еще не должен был на самом деле делать этого, но я рассматриваю его.
сценарий/бегун и задачи граблей прекрасно подходят для выполнения как задания крона.
Вот одна очень важная вещь, которую необходимо помнить когда рабочие задания крона. Их, вероятно, не назовут от корневого каталога Вашего приложения. Это означает, что все Ваш требуют для файлов (в противоположность библиотекам), должен быть сделан с явным путем: например, File.dirname (__ ФАЙЛ __) + "/other_file". Это также означает, что необходимо знать, как явно назвать их из другого каталога:-)
Проверка, если поддержки кода, выполняемые из другого каталога с
# 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
кроме того, задания крона, вероятно, не работают как Вы, не зависьте ни от какого ярлыка, Вы вставляете .bashrc. Но это - просто стандартная подсказка по крону;-)
Принятие Ваших задач не занимает слишком много времени завершать, просто создавать новый контроллер с действием для каждой задачи. Реализуйте логику задачи как код контроллера, Затем настройте cronjob на уровне ОС, который использует wget для вызова URL этого контроллера и действия в интервалах подходящего времени. Преимущества этого метода - Вы:
Используйте Craken (обстреляйте центральные задания крона)