Вы можете использовать cron
вместе с ./script/rails runner
, который может выполнить любой метод из вашего приложения rails.
Поскольку вам нужно выполнять какое-то действие каждую секунду, вы можете запустить это runner
один раз и создать цикл. Вы можете запустить его из cron, сохранить PID где-нибудь, а затем попросить cron убить данный процесс, ИЛИ вы можете просто перевести тайм-аут в свой код Ruby в цикле. Простой пример:
class MyModelOrAnything
def self.start_loop
stop_fname = "./stop_the_loop"
while !File.exist? stop_fname
do_this_action
sleep 1
end
ensure
File.unlink stop_fname if File.exist? stop_fname
end
end
Задача cron может затем создать файл "stop_the_loop" в известном каталоге, и ваша задача остановится через секунду.
На самом деле, в этом случае cron может не понадобиться. Поскольку у вас должен быть только один экземпляр этого скрипта, было бы лучше запустить его вручную и остановить вручную. Если вы хотите использовать cron, вы можете добавить семафороподобный файл, который сообщит сценарию, что один процесс уже запущен (файл должен быть удален с помощью блока «sure»).
Пример конфигурации cron:
0 8 * * 1 cd /my/app && bundle exec ./script/rails runner ThisObject.start_loop
0 22 * * 5 touch /my/app/stop_the_loop
.. и пример с этим семафором:
class MyModelOrAnything
def self.start_loop
running_fname = "./i_am_working"
return :already_running if File.exist? running_fname
stop_fname = "./stop_the_loop"
begin
File.open(running_fname,'w') {|f| f.write Time.now.to_s(:db) }
while !File.exist? stop_fname
do_this_action
sleep 1
end
ensure
File.unlink running_fname if File.exist? running_fname
File.unlink stop_fname if File.exist? stop_fname
end
end
end