Forum: Ruby on Rails Schedule job in rails

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Af3cecc8af253b5acd3c09c5b67c0074?d=identicon&s=25 Valentino Lun (on9west)
on 2009-02-13 04:48
Dear all

I created a module in my_rails_project/lib/ssc.rb. I can execute the
method in rails console (i.e. SSC::Monitor.method1(a,b)). How can I
execute the method regularly? I am using Linux, can I do it using
`crontab`? Thank you.

module SSC
  class Monitor
    def self.method1(a,b)
       bla bla bla
       some code will access the model class
    end

    def self.method1(a,b)
    end
  end
end


Many thanks

Valentino
Af3cecc8af253b5acd3c09c5b67c0074?d=identicon&s=25 Valentino Lun (on9west)
on 2009-02-13 04:53
Dear all

I tried script/runner for this, but every execution need to initialize
the rails environment. Any other good idea for it? What is your
good/best practice?

Many thanks

Valentino
53be54e5db4dc58e4980db5a8255621b?d=identicon&s=25 Harold (Guest)
on 2009-02-13 05:26
(Received via mailing list)
Especially if this method is accessing your models, I don't see a way
around loading your entire rails environment.

I think a more common solution would be to create a rake task which
you invoke with cron...

On Feb 12, 10:53 pm, Valentino Lun <rails-mailing-l...@andreas-s.net>
Af3cecc8af253b5acd3c09c5b67c0074?d=identicon&s=25 Valentino Lun (on9west)
on 2009-02-13 05:31
> I think a more common solution would be to create a rake task which
> you invoke with cron...

Thank for your reply

How can I do it with rake task? Can you give me some reference?

Thanks again

Valentino
71ee1809f53df0a2b4dac0530f630933?d=identicon&s=25 Richard Schneeman (snowmaninthesun)
on 2009-02-13 05:34
Check out http://railscasts.com/episodes/128-starling-and-workling and
http://railscasts.com/episodes/130-monitoring-with-god

There are a number of different ways to have a task persist, and run on
a regular schedule. I've also previously used background-db and cron
seems to be a popular option. I tend to go with whatever has the easiest
tutorials that i can find!

Anyone else feel free to weigh in if you have any more suggestions.
661ae6e97d0e16c2af2aaf7d197e8387?d=identicon&s=25 Sijo k g (sijo)
on 2009-02-13 10:25
3c372f9ca7f6883e3c33b482c2fa8341?d=identicon&s=25 Mario Gutierrez (mgutz)
on 2009-02-13 16:55
I use cron to schedule wget:

 wget http://localhost:3000/cron

cron_controller invokes your method
53be54e5db4dc58e4980db5a8255621b?d=identicon&s=25 Harold A. Gimenez (Guest)
on 2009-02-13 17:08
(Received via mailing list)
That's a great idea, until someone in the outside finds out about that
path/resource. You're opening up too much and scriptkiddies can get
happy attempting a DoS. Wondering if you handle that somehow (IP address
check or something)?
280b78a61a968391b7e07e912be102a8?d=identicon&s=25 Robert Walker (robert4723)
on 2009-02-13 17:53
Harold A. Gimenez wrote:
> That's a great idea, until someone in the outside finds out about that
> path/resource. You're opening up too much and scriptkiddies can get
> happy attempting a DoS. Wondering if you handle that somehow (IP address
> check or something)?

How about using HTTP basic authentication so only authorized clients can
access the controller action? Which would be only your rake task.

I haven't thought this through, It's just the first thing that came to
mind.
96146b7a23174e2e024c06a49f845bb8?d=identicon&s=25 Jeffrey L. Taylor (Guest)
on 2009-02-13 18:22
(Received via mailing list)
If there are no hostile users on the server, in the controller:

if local_request?
  do the action
else
  ignore or log hostile action
end


HTH,
  Jeffrey

Quoting Harold A. Gimenez <harold.gimenez@gmail.com>:
Af3cecc8af253b5acd3c09c5b67c0074?d=identicon&s=25 Valentino Lun (on9west)
on 2009-02-14 05:47
Mario Gutierrez wrote:
> I use cron to schedule wget:
>
>  wget http://localhost:3000/cron
>
> cron_controller invokes your method

Thanks, it is a very good idea. How about if my action require 2
parameters? How to do that?

Thanks again

Valentino
3131fcea0a711e5ad89c8d49cc9253b4?d=identicon&s=25 Julian Leviston (Guest)
on 2009-02-14 06:21
(Received via mailing list)
That can be spoofed

Blog: http://random8.zenunit.com/
Learn rails: http://sensei.zenunit.com/

On 14/02/2009, at 4:21 AM, "Jeffrey L. Taylor" <ror@abluz.dyndns.org>
Af3cecc8af253b5acd3c09c5b67c0074?d=identicon&s=25 Valentino Lun (on9west)
on 2009-02-14 06:52
>>  wget http://localhost:3000/cron
>>
>> cron_controller invokes your method
>
> Thanks, it is a very good idea. How about if my action require 2
> parameters? How to do that?

Let me further elabroate on my question. For example in my Cron
Controller

def someaction
   some_method(params[:one],params[:two])
end

Is it possible to do this in my crontab as follow?

10 10 * * * wget http://localhost:3000/cron/someaction "para1" "para2"

Many thanks

Valentino
F5b3c1ebfb2e9fc5f67bb48b119f6054?d=identicon&s=25 Randy Kramer (Guest)
on 2009-02-14 16:13
(Received via mailing list)
On Saturday 14 February 2009 12:52 am, Valentino Lun wrote:
> Is it possible to do this in my crontab as follow?
>
> 10 10 * * * wget http://localhost:3000/cron/someaction "para1" "para2"

I'm not sure, but an alternative is to put the wget command in a small
shell script (Linux talk, iiuc) or a .bat file (MS talk, iiuc).  Then
invoke that shell script or .bat file from cron.

Randy Kramer
--
I didn't have time to write a short letter, so I created a video
instead.--with apologies to Cicero, et.al.
53be54e5db4dc58e4980db5a8255621b?d=identicon&s=25 Harold A. Giménez Ch. (Guest)
on 2009-02-14 17:14
(Received via mailing list)
No quite like that. If you're sending an HTTP GET request to any URL,
you
would pass parameters to the URL itself, something like:
http://localhost:3000/cron?param1=value1&param2=value2 etc

What looks attractive to me about this approach (of using wget via cron
instead of a rake task) is that you are not bringing up an entire rails
environment to handle a task. There's less overhead. Just be sure to
lock it
down with a combination of things that have been suggested here: IP
Address
check, local_request?, http basic authentication. There may be more you
can
do...

On Sat, Feb 14, 2009 at 12:52 AM, Valentino Lun <
96146b7a23174e2e024c06a49f845bb8?d=identicon&s=25 Jeffrey L. Taylor (Guest)
on 2009-02-15 10:20
(Received via mailing list)
Citation needed.

Quoting Julian Leviston <julian@coretech.net.au>:
D3fc5887a2f39f2e0c8989d39ce5e6f9?d=identicon&s=25 Bharat Ruparel (bruparel)
on 2009-02-15 15:10
(Received via mailing list)
> def someaction
>    some_method(params[:one],params[:two])
> end
>
> Is it possible to do this in my crontab as follow?
>
> 10 10 * * * wgethttp://localhost:3000/cron/someaction"para1" "para2"
>

You will need to pass the para1, and para2 to the someaction method so
at a minimum you have to change the signature of the someaction method
as below:

def someaction para1, para2
  ...
end

now within this method you can do anything you want only thing is that
this method needs to be public in scope and you need to make sure that
it requires no authentication otherwise your wget request will fail.
I usually use script/runner in Rails for such needs.  wget may or may
not work depending on how restful your routes are and controller
action is.

Bharat
This topic is locked and can not be replied to.