Fragen zu runner Script

Hallo,
ich habe gerade versucht meine Sessions per runner script aufzuräumen.
Das runner script sieht folgendermassen aus:

#!/usr/bin/env ruby
require File.dirname(FILE) + ‘/…/config/boot’

class SessionCleaner
def self.remove_stale_sessions
CGI::Session::ActiveRecordStore::Session.destroy_all( [‘updated_at
<= ?’, 30.minutes.ago] )
end
end

Wenn ich jetzt allerdings das Script per: ruby script\runner -e
development SessionCleaner.remove_stale_sessions aufrufe
passiert nichts. Ich bekomme keine Fehlermeldung, aber es wird auch
nichts aus der DB gelöscht.

Wenn ich allerdings
CGI::Session::ActiveRecordStore::Session.destroy_all( [‘updated_at <=
?’, 30.minutes.ago] ) aus der rails
Konsole aus aufrufe werde die Sessions wie erwartet gelöscht. Fehlt mir
da wieder etwas dass der Aufruf in dem runner
nicht ausgeführt werden kann? Sollte ich dann aber nicht iene
Fehlermeldung oder sonstwas erhalten?

Gruß und Danke

Daniel

Hi!
On Fri, Jan 04, 2008 at 03:01:10PM +0100, Daniel W. wrote:

<= ?', 30.minutes.ago] )
end
end

Wenn ich jetzt allerdings das Script per: ruby script\runner -e
development SessionCleaner.remove_stale_sessions aufrufe
passiert nichts. Ich bekomme keine Fehlermeldung, aber es wird auch
nichts aus der DB gelöscht.

wo liegt denn dein script? Damit dein Aufruf funktioniert müsste die
SessionCleaner-Klasse vom Rails-Autoloader aufgefunden werden können,
d.h. bspw. in lib/session_cleaner.rb deklariert sein. Da drin sollte
dann auch kein require und keine Interpreter-Deklaration drin sein - das
macht ja alles script/runner schon.

Alternativ kannst du das SessionCleaner.remove_stale_sessions auch in
die Datei selbst reinschreiben, und dann nur den relativen Pfad zur
Datei als Argument an runner übergeben.

Grüße,Jens


Jens Krämer
http://www.jkraemer.net/ - Blog
http://www.omdb.org/ - The new free film database

wo liegt denn dein script? Damit dein Aufruf funktioniert müsste die
SessionCleaner-Klasse vom Rails-Autoloader aufgefunden werden können,
d.h. bspw. in lib/session_cleaner.rb deklariert sein. Da drin sollte
dann auch kein require und keine Interpreter-Deklaration drin sein - das
macht ja alles script/runner schon.

Alternativ kannst du das SessionCleaner.remove_stale_sessions auch in
die Datei selbst reinschreiben, und dann nur den relativen Pfad zur
Datei als Argument an runner übergeben.

Der eben gepostete Code ist der komplette Inhalt von
[RAILS_APP]/script/runner.
Ist also kein sep. Script welches nicht gefunden werden könnte.

Versteh ich da jetzt was falsch, oder kann man das so nicht machen?
So hab ich es aufjedenfall mal aus Beispielen aus dem Web rausgelesen.

Oder muss die Definition ausserhalb von script/runner erfolgen?
Jetzt steh ich komplett auf dem Schlauch.

Am 04.01.2008 um 15:01 schrieb Daniel W.:

end
end

Irgendwie fehlt da noch die entscheidende Zeile am Ende, oder?

SessionCleaner.remove_stale_sessions

Gruß,
Martin


GL Networks
Martin R.
mail [email protected]
www http://www.glnetworks.de/

Ich freue mich immer über eine Empfehlung bei workingwithrails…
<http://www.workingwithrails.com/recommendation/new/person/6641-martin-rehfeld


rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

Rehfeld, Martin schrieb:

CGI::Session::ActiveRecordStore::Session.destroy_all( [‘updated_at
<= ?’, 30.minutes.ago] )
end
end

Irgendwie fehlt da noch die entscheidende Zeile am Ende, oder?

SessionCleaner.remove_stale_sessions
Genau der Aufruf erfolgt ja per Cron mit:

ruby script\runner -e development SessionCleaner.remove_stale_sessions

Am 04.01.2008 um 15:40 schrieb Daniel W.:

Genau der Aufruf erfolgt ja per Cron mit:

ruby script\runner -e development SessionCleaner.remove_stale_sessions

Nicht lieber / statt \ ?

ciao, tom


Thomas R. “TomK32” Koll || http://tomk32.de || http://ananasblau.com
(NEW)
just a geek trying to change the world
Skype: TomK32 || Mail: [email protected]

Das ist unter Windows egal.
ruby script\runner -e development SessionCleaner.remove_stale_sessions
ist gleich
ruby script/runner -e development SessionCleaner.remove_stale_sessions

Da nimmt sich ruby was es braucht. :wink:

Thomas R. Koll schrieb:

Am 04.01.2008 um 15:40 schrieb Daniel W.:

Genau der Aufruf erfolgt ja per Cron mit:

ruby script\runner -e development SessionCleaner.remove_stale_sessions

Also in dem Fall würde ich Dir empfehlen, entweder obigen Aufruf
gleich mit dem Code auszustatten, den Du eigentlich ausführen willst

ruby script/runner -e development
“CGI::Session::ActiveRecordStore::Session.destroy_all([‘updated_at
<= ?’, 30.minutes.ago])”

(wahrscheinlich willst Du es nachher natürlich mit -e production
aufrufen)

O D E R

Du packst Deine Klassendefinition in lib/session_cleaner.rb - dann
aber nur die Klasse ohne Shebang #! und require boot! Dann sollte Dein
alter cron-Aufruf auch funktionieren, da die Klasse dann vom Rails-
Autoloader gefunden werden kann.

Gruß,
Martin


GL Networks
Martin R.
mail [email protected]
www http://www.glnetworks.de/

Ich freue mich immer über eine Empfehlung bei workingwithrails…
<http://www.workingwithrails.com/recommendation/new/person/6641-martin-rehfeld

On Fri, Jan 04, 2008 at 03:27:13PM +0100, Daniel W. wrote:

Der eben gepostete Code ist der komplette Inhalt von [RAILS_APP]/script/runner.
Ist also kein sep. Script welches nicht gefunden werden könnte.

Hm, also ich würde nicht empfehlen script/runner zu verändern.

script/runner ist ja dazu da, beliebige übergebene Kommandos (oder
auch skripte) im Kontext deiner Anwendung auszuführen. natürlich kannst
du Klassendeklarationen die du nur für so ausgeführte Sachen brauchst
dort drin machen, aber die entscheidende Zeile aus dem originalen
runner-Skript:

require ‘commands/runner’

sollte am Ende erhalten bleiben, die sorgt nämlich dafür dass die
Argumente des Skript-Aufrufs (also dein SessionCleaner-call)
ausgeführtwerden.

Grüße,Jens


Jens Krämer
http://www.jkraemer.net/ - Blog
http://www.omdb.org/ - The new free film database

Ok, so habe ich es jetzt auch gemacht. Also im Prinzip so wie Martin es
geschreiben hat,
und du jetzt auch nochmal drauf hingewiesen hast. Scheint jetzt auch wie
erwartet zu funktionieren.

Ich glaube ich hattte das auch falsch verstanden. Die Methoden die in
den Web Beispielen gezeigt wurden,
wurden wohl in den Models erstellt, und dann per Runner aufgerufen. Ich
dachte man müsste die Funktion
im Runner Script selbst implementieren. Habe es so jetzt nicht versucht
weil ich kein Session Modell habe,
und auch nicht wirklich brauche. Werde das Ganze aber mal mit was
anderem Testen. Weil so sollte es
dann wohl gedacht sein.

Danke an alle die geholfen haben. :slight_smile:

Gruss

Jens K. schrieb:

meine 2 cents:
also script/runner ist dafür da, um Ruby-Code im Context deiner
Rails-Anwendung laufen zu lassen. Es kann als Befehl, so wie
‘script/server’ angesehen werden und sollte nicht verändert werden.

2 Möglichkeiten den runner zu benutzen:

  1. ./script/runner ‘puts Person.find(1).name’

  2. ein anderes Script bauen mit ‘#!/usr/bin/env
    /home/rails/<app_dir>/script/runner’ als erste Zeile.
    das kannst du dann einfach aufrufen und wird dann automatisch in der
    Rails Applikation
    ausgeführt.
    Eine gute Hilfe ist es, einfach mal ‘./script/runner -h’ einzugeben. :wink:

-Alex