2012-04-09 6 views
0

Ich habe eine Rails-Anwendung, die Resque für eine Jobwarteschlange verwendet. Die Resque Arbeiter-Klasse ist "JobDo" und ist in app/Arbeiter/job_do.rbJRuby-Anweisung in einem Bash-Skript mit Umgebungsvariablen

ich ein Skript (jobdo.sh) haben, die einen Job in die Warteschlange gestellt wird:

jruby -e 'load "/home/abc/myapp/app/workers/job_do.rb"; Resque.enqueue(JobDo, Time.now.utc)' >> /home/abc/logs/resque.log 2>&1 

jedoch .. .Ich möchte in der Lage sein, dies in einer Rails-Umgebung auszuführen, die nicht dieselbe Log-Datei, denselben Benutzer oder dasselbe Rails-Anwendungsstammverzeichnis verwendet. Ich sehe etwas zu tun, wie folgt aus:

export $USER_HOME=/home/abc 
export $LOGFILE=$USER_HOME/logs/resque.log 
export $SERVER_HOME=/home/abc/myapp 

jruby -e 'load "$SERVER_HOME/app/workers/job_do.rb"; Resque.enqueue(JobDo,Time.now.utc)' >> $LOGFILE 2>&1 

Dies würde lassen jede $ USER_HOME Benutzer bearbeiten und $ server_home und den Code in ihrer Umgebung ausgeführt werden.

Dies funktioniert jedoch nicht, weil ich nicht herausfinden kann, wie die einfachen und doppelten Anführungszeichen zu verwenden, um die Umgebungsvariablen zu verwenden. Wie mache ich das?

Antwort

0

Ich denke, dass Sie die einfachen Anführungszeichen mit doppelten Anführungszeichen ersetzen können, und entfernen Sie den inneren Satz zitiert:

export USER_HOME=/home/abc 
export LOGFILE=$USER_HOME/logs/resque.log 
export SERVER_HOME=/home/abc/myapp 

jruby -e "load $SERVER_HOME/app/workers/job_do.rb; Resque.enqueue(JobDo,Time.now.utc)" >> $LOGFILE 2>&1 

Dies sollte solange keine der Variablen enthalten Räumen arbeiten.

1

Hier gibt es mehrere Probleme. Erstens, wenn Sie Variablen zuweisen, verwenden Sie keine $. Zweitens müssen Sie die Variablen nicht exportieren, da sie in der Shell verwendet werden und nicht als Umgebungsvariablen an die ausgeführten Programme übergeben werden. Drittens ersetzt die Shell keine Variablen in einfachen Anführungszeichen. Daher müssen Sie in doppelte Anführungszeichen wechseln (und dann die doppelten Anführungszeichen, die an jruby übergeben werden sollen, ausschließen). Schließlich würde ich $USER_HOME und $LOGFILE in Anführungszeichen setzen, nur für den Fall, dass es Leerzeichen oder andere lustige Zeichen enthält. Hier ist, was ich bekomme:

USER_HOME=/home/abc 
LOGFILE="$USER_HOME/logs/resque.log" 
SERVER_HOME=/home/abc/myapp 

jruby -e "load \"$SERVER_HOME/app/workers/job_do.rb\"; Resque.enqueue(JobDo,Time.now.utc)" >> "$LOGFILE" 2>&1 
Verwandte Themen