2012-04-09 121 views
0

我有一個使用Resque作爲隊列的Rails應用程序。該Resque工人階級是「JobDo」,並在應用程序/工人/ job_do.rb帶有環境變量的bash腳本中的JRuby語句

我有一個腳本(jobdo.sh),這將使作業到隊列中:

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

但是.. 。我希望能夠在不使用相同日誌文件,用戶或Rails應用程序根的rails環境中運行。我覺得那樣做這樣的事情:

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 

這將讓任何用戶編輯$ USER_HOME和$ SERVER_HOME並在他們的環境中運行的代碼。

但是,這不起作用,因爲我無法弄清楚如何旋轉單引號和雙引號來使用環境變量。我該怎麼做呢?

回答

0

我認爲你可以取代單引號與雙引號,然後取出內部的一組引號:

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 

這應該只要沒有變量包含空格的工作。

1

這裏有幾個問題。首先,當分配給變量時,不要使用$。其次,你不需要導出變量,因爲它們在shell中被使用,而不是作爲環境變量傳遞給它運行的程序。第三,shell不會替換單引號內的變量,因此您需要切換到雙引號(然後轉義您要傳遞給jruby的雙引號)。最後,我會將$USER_HOME$LOGFILE用雙引號括起來,以防萬一它包含空格或任何其他有趣的字符。這裏是我得到的:

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