我有一个从控制器调用的rake任务 - 实际上控制器调用bash脚本,该脚本调用rake任务。我们这样做,以便员工可以请求数据库导入,重新导入数据并重新启动应用程序。
在命令行,它的工作原理。 ENV['HOME']
已设置。
然而,当我们通过控制器调用它时 - > bash脚本,rake任务声称它是零。
那么,可能导致这种情况的原因是什么?不应该$HOME
始终可见吗?
更新:
控制器(通过unicorn web服务器)调用bash脚本,如下所示:system("#{Rails.root}/lib/cron/manual_digest.bash")
在被调用的bash脚本中,我运行export -p
并得到:
declare -x BUNDLE_BIN_PATH="/usr/local/lib/ruby/gems/2.1.0/gems/bundler-1.5.3/bin/bundle"
declare -x BUNDLE_GEMFILE="/var/www/ma_staging/releases/20150319193546/Gemfile"
declare -x BUNDLE_ORIG_MANPATH="/var/www/ma_staging/shared/bundle/ruby/2.1.0/gems/unicorn-4.8.3/man"
declare -x GEM_HOME="/var/www/ma_staging/shared/bundle/ruby/2.1.0"
declare -x GEM_PATH=""
declare -x LANG="en_US.UTF-8"
declare -x MANPATH="/var/www/ma_staging/shared/bundle/ruby/2.1.0/gems/unicorn-4.8.3/man"
declare -x OLDPWD="/var/www/ma_staging/current"
declare -x OLD_PID="/var/www/ma_staging/shared/pids/unicorn.pid.oldbin"
declare -x PATH="/var/www/ma_staging/shared/bundle/ruby/2.1.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
declare -x PID="/var/www/ma_staging/shared/pids/unicorn.pid"
declare -x PWD="/home/deploy/ma_staging/current"
declare -x RACK_ENV="staging"
declare -x RAILS_ENV="staging"
declare -x RUBYLIB="/usr/local/lib/ruby/gems/2.1.0/gems/bundler-1.5.3/lib"
declare -x RUBYOPT="-rbundler/setup"
declare -x SHLVL="2"
declare -x TERM="xterm-256color"
declare -x UNICORN_FD="12,13"
declare -x _ORIGINAL_GEM_PATH=""
通过rails控制台运行同样的命令:
export BUNDLE_BIN_PATH='/usr/local/lib/ruby/gems/2.1.0/gems/bundler-1.5.3/bin/bundle'
export BUNDLE_GEMFILE='/var/www/ma_staging/releases/20150319193546/Gemfile'
export BUNDLE_ORIG_MANPATH='/var/www/ma_staging/shared/bundle/ruby/2.1.0/gems/unicorn-4.8.3/man'
export COLUMNS='213'
export GEM_HOME='/var/www/ma_staging/shared/bundle/ruby/2.1.0'
export GEM_PATH=''
export HOME='/home/deploy'
export LANG='en_US.UTF-8'
export LESSCLOSE='/usr/bin/lesspipe %s %s'
export LESSOPEN='| /usr/bin/lesspipe %s'
export LINES='50'
export LOGNAME='deploy'
export MAIL='/var/mail/deploy'
export MANPATH='/var/www/ma_staging/shared/bundle/ruby/2.1.0/gems/unicorn-4.8.3/man'
export OLDPWD='/home/deploy/ma_staging/current/lib'
export PATH='/var/www/ma_staging/shared/bundle/ruby/2.1.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games'
export PS1='\u:\W\$ '
export PWD='/home/deploy/ma_staging/current'
export RAILS_ENV='staging'
export RUBYLIB='/usr/local/lib/ruby/gems/2.1.0/gems/bundler-1.5.3/lib'
export RUBYOPT='-rbundler/setup'
export SHELL='/bin/bash'
export SHLVL='1'
export SSH_AUTH_SOCK='/tmp/ssh-jkdbX19657/agent.19627'
export SSH_CLIENT='68.82.90.217 38992 22'
export SSH_CONNECTION='55.55.55.55 3322 55.55.55.55 22'
export SSH_TTY='/dev/pts/0'
export TERM='xterm'
export USER='deploy'
export _='/usr/local/bin/bundle'
export _ORIGINAL_GEM_PATH=''
我调查了#34;限制贝壳"但这并没有完全解释我所看到的,变量缺失。我也研究过"子弹" (因为第一个输出是SHLVL=2
),但这也没有具体解释这种行为。
我正在寻找某些文档或某些地方说"当你做X时,$ HOME和$ USER的变量没有设置,因为Z"
我怀疑与独角兽有什么关系,但没有找到任何解释为什么这些变量是空的。
答案 0 :(得分:1)
尝试将echo "USER: $USER"
添加到bash脚本中,以查看正在运行的用户控制器。用户可以在没有主目录的情况下创建,因此这可能是您遇到的问题。例如,Apache www服务器的用户apache
没有主目录。
您还可以在bash脚本中设置环境。如果未设置$HOME
,您可以将其设置为/tmp
??
答案 1 :(得分:1)
虽然通过控制器运行rake任务是一个坏主意,但仍然是这样你可以运行它并获得所有env的访问权限。变量。试一试
system "/bin/bash -l -c 'cd #{Rails.root.to_s} && RAILS_ENV=production bundle exec rake task_namespace:it_might_work --silent'"
此外,如果上述内容失败,您可以将agruement传递给rake任务。请参阅How to pass command line arguments to a rake task
顺便说一句,我强烈建议将此rake任务作为后台脚本。使用sidekiq
或delayed_job
等
答案 2 :(得分:1)
好的,事实证明问题在于unicorn的启动方式和我们的suoders配置文件,这是错误配置的。我担心这是一些错误 - 不,只是我们的错误配置。