0

我有一个使用 Resque 作为作业队列的 Rails 应用程序。Resque 工人类是“JobDo”,位于 app/workers/job_do.rb

我有一个脚本(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 并在他们的环境中运行代码。

但是,这不起作用,因为我无法弄清楚如何旋转单引号和双引号来使用环境变量。我该怎么做呢?

4

2 回答 2

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
于 2012-04-09T23:42:55.263 回答
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

只要没有任何变量包含空格,这应该可以工作。

于 2012-04-09T23:09:02.793 回答