1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

osx zsh+crontab+rbenvでの/usr/libexec/path_helperパス変更問題

Last updated at Posted at 2017-09-18

問題

crontabで以下のように確認しても$PATHがおかしい、設定が通常のログインと微妙に違う。それ故にエラーなどが起きる

crontab
* * * * * $(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などからシェルパスを明示して実行など)により読み込まれるファイルの種類はあるが、流れは次のよう。

  1. /etc/zshenv
  2. $ZDOTDIR/.zshenv
  3. /etc/zprofile
  4. $ZDOTDIR/.zprofile
  5. /etc/zshrc
  6. $ZDOTDIR/.zshrc
  7. /etc/zlogin
  8. $ZDOTDIR/.zlogin
  9. /etc/zlogout
  10. $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呼ばない方法などもあるが、出来るだけ現状を崩さず、設定ファイルに変化を加えない方向でやってみた。

  1. .zshrcにユーザー特定のPATHのexportを書かない
  2. 従って.zshrcにrbenvの為のeval "$(rbenv init -)"を書かない
  3. .zshrcにユーザー特定のaliasを書かない
  4. .zshrcに各種定数exportを書かない

代わりに~/.zprofileを無ければ新規で作って、.zshrcに追記するだろう項目をいつも通りに入れていく

これによりcronから$(which zsh) -lc '....'呼ばれようが、通常通りシェルを開こうが.zprofileは通るので設定が同じになる。

#.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使用例

.zprofile
# bundle execした時の no matches found 回避
alias bundle_rake='noglob bundle exec rake'
schedule.rb
set :job_template, "$(which zsh) -lc ':job'"
# bundle_rakeを使う
job_type :rake,    "cd :path && :environment_variable=:environment bundle_rake :task --silent :output"

...
...
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?