簡體   English   中英

為什么ENV [“HOME”]在我的佣金任務中沒有?

[英]Why is ENV[“HOME”] nil in my rake task?

我有一個從控制器調用的rake任務 - 實際上控制器調用一個調用rake任務的bash腳本。 我們這樣做,以便員工可以請求數據庫導入,重新導入數據並重新啟動應用程序。

在命令行,它的工作原理。 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=''

我查看了“受限制的炮彈”,但這並沒有完全解釋我所看到的,變量缺失。 我也研究了“子殼”(因為第一個輸出是SHLVL=2 ),但這也沒有具體解釋這種行為。

我正在尋找一些文檔或某些地方說“當你做X時,因為Z而沒有設置$ HOME和$ USER的變量”

我懷疑與獨角獸的東西,但沒有找到任何解釋為什么這些變量將是空的。

嘗試將echo "USER: $USER"到bash腳本中,以查看正在運行的用戶控制器。 可以在沒有主目錄的情況下創建用戶,因此這可能是您遇到的問題。 例如,Apache www服務器的用戶apache沒有主目錄。

您還可以在bash腳本中設置環境。 如果未設置$HOME您可以將其設置為/tmp ??

盡管通過控制器運行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任務。 請參閱如何將命令行參數傳遞給rake任務

順便說一下,我強烈建議把這個rake任務作為后台腳本。 使用它sidekiqdelayed_job等。

好的,事實證明問題在於unicorn的啟動方式和我們的suoders配置文件,這是錯誤配置的。 我擔心這是一些錯誤 - 不,只是我們的錯誤配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM