【问题标题】:Why is ENV["HOME"] nil in my rake task?为什么 ENV["HOME"] 在我的 rake 任务中为零?
【发布时间】:2015-03-24 12:53:31
【问题描述】:

我有一个从控制器调用的 rake 任务 - 实际上控制器调用了一个 bash 脚本,该脚本调用了一个 rake 任务。我们这样做是为了让员工可以请求数据库导入,从而重新导入数据并重新启动应用程序。

在命令行,它可以工作。 ENV['HOME'] 已设置。

但是,当我们通过控制器 -> bash 脚本调用它时,rake 任务声称它为 nil。

那么,这可能是什么原因造成的? $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=''

我查看了“受限外壳”,但这并不能完全解释我所看到的,缺少变量。我还研究了“子shell”(因为第一个输出是SHLVL=2),但这也没有具体解释这种行为。

我正在寻找一些文档或某处说“当你执行 X 时,$HOME 和 $USER 的变量没有设置,因为 Z”

我怀疑独角兽有什么问题,但没有找到任何东西来解释为什么这些变量会为空。

【问题讨论】:

  • 更新:当我查看 PS 输出时,rake 任务正在以预期用户身份运行
  • 控制器如何执行脚本?脚本如何执行 rake 任务?什么命令/等等。 确实
  • @EtanReisner 我用更多信息更新了我原来的问题
  • 独角兽自己能看到HOME/etc吗?我将假设它没有,并且它在有意清理的环境中运行,因此当它产生子外壳时(/bin/sh 很可能来自system,尽管如果有一个shebang,它可能会运行bash我不确定脚本上的行)它也没有这些变量可用。但这只是猜测。

标签: ruby-on-rails ruby bash rake unicorn


【解决方案1】:

尝试将echo "USER: $USER" 添加到您的 bash 脚本中,以查看正在运行的用户控制器。可以在没有主目录的情况下创建用户,因此这可能就是您遇到的问题。例如,Apache www 服务器的用户 apache 没有主目录。

您也可以在 bash 脚本中设置环境。如果$HOME 没有设置,你可以设置为/tmp??

【讨论】:

  • 有趣;当我尝试做ENV['USER'] 它也是nil 这怎么可能?
  • 不确定那个..也许尝试检查控制器的服务? '/etc/init.d' 条目。它可能有助于提供关于正在发生的事情的线索。我认为在你的 bash 脚本中检查 $HOME 并设置和替换如果它没有定义是最好的路线。
  • 是的,我们已经设法以另一种方式绕过了这个问题 - 但我们不知道它为什么会这样,并且手动设置 $HOME 虽然它可以工作,但它更像是一种 hack 而不是一个修复。我确信对于我们所看到的情况有某种合乎逻辑的解释,但我不知道它是什么。
【解决方案2】:

虽然通过控制器运行 rake 任务是一个坏主意,但这仍然是您可以运行它并访问所有环境的方式。变量。试试看

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 任务作为后台脚本。使用它sidekiqdelayed_job 等。

【讨论】:

  • 好的,我试了一下;仍然没有骰子。通过export -p 可用的变量没有改变,即使在停止/启动独角兽之后
【解决方案3】:

好的,原来问题在于独角兽的启动方式和我们的 suoders 配置文件,该文件配置错误。我担心这是一些错误 - 不,只是我们的配置错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    相关资源
    最近更新 更多