問題
crontabで以下のように確認しても$PATHがおかしい、設定が通常のログインと微妙に違う。それ故にエラーなどが起きる
* * * * * $(which zsh) -lc 'echo $PATH > /Users/USER_NAME/Downloads/PATH; which zsh >> /Users/USER_NAME/Downloads/PATH'
ファイルの監視
touch /Users/USER_NAME/Downloads/PATH && tail -f /Users/USER_NAME/Downloads/PATH
#原因
起動のさせ方(いつも通りターミナルを開く、cronなどからシェルパスを明示して実行など)により読み込まれるファイルの種類はあるが、流れは次のよう。
- /etc/zshenv
- $ZDOTDIR/.zshenv
- /etc/zprofile
- $ZDOTDIR/.zprofile
- /etc/zshrc
- $ZDOTDIR/.zshrc
- /etc/zlogin
- $ZDOTDIR/.zlogin
- /etc/zlogout
- $ZDOTDIR/.zlogout
el capitan以降のOSXでは /etc/zprofile
に /usr/libexec/path_helper
というものが書かれていてパスを書き換えている様子。
この書き換えによってcronでは/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
が~/.rbenv/shims
~/.rbenv/bin
などより先に来て、cron実行時にシステム側のrubyが呼ばれて、gemが無いとか色々な問題に出くわす。
#対処法
検索すると色々あり、brew install --without-etcdir zsh
でそもそも/usr/libexec/path_helper
呼ばない方法などもあるが、出来るだけ現状を崩さず、設定ファイルに変化を加えない方向でやってみた。
-
.zshrc
にユーザー特定のPATHのexportを書かない - 従って
.zshrc
にrbenvの為のeval "$(rbenv init -)"
を書かない -
.zshrc
にユーザー特定のaliasを書かない -
.zshrc
に各種定数exportを書かない
代わりに~/.zprofile
を無ければ新規で作って、.zshrc
に追記するだろう項目をいつも通りに入れていく
これによりcronから$(which zsh) -lc '....'
呼ばれようが、通常通りシェルを開こうが.zprofile
は通るので設定が同じになる。
#.zprofile例
# rails
export SECRET_KEY_BASE=4a15a58c0c7bc18b3d2cce505ccfc2896f9a7e2452b4abd858a3e27eadfaf71070a250c76bd51499c201efd622adc78e24b38f7b2c99505634cf6d26c767da6e
export RAILS_SERVE_STATIC_FILES=true
#rbenv
export PATH=$HOME/.rbenv/bin:$HOME/bin:$PATH
eval "$(rbenv init -)"
# zshだとrakeのパラメーター[]でno matches foundエラーになるのでその回避
# https://github.com/robbyrussell/oh-my-zsh/issues/433
alias rake='noglob rake'
#whenever使用例
# bundle execした時の no matches found 回避
alias bundle_rake='noglob bundle exec rake'
set :job_template, "$(which zsh) -lc ':job'"
# bundle_rakeを使う
job_type :rake, "cd :path && :environment_variable=:environment bundle_rake :task --silent :output"
...
...