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?
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.
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.
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
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.
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.
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.
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:
./script/runner ‘puts Person.find(1).name’
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.
-Alex
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.