2012-04-09 84 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