[go: up one dir, main page]
More Web Proxy on the site http://driver.im/

週刊これは夢?!

それとも…。
すぐ忘れちゃうので備忘録用ブログ。
週1ペースで書くことを、ゆるい目標にしていました。

cron でエラー

2010-12-20 | 電脳
cronで動かしていたプログラムが "env: ruby: No such file or directory" というエラーを吐いて動かなくなった。
コマンドラインから動かすときは問題はおきず、cronからのみ。cronのpathが通っていない(※)ようだ。

FreeBSDの場合、/etc/crontab の中にある PATH を編集してやる方法がある。
今回は、特定のプログラムさえ動けばいいので、部分的にpathを通す方法を探した。

/usr/local/binをpathに追加したかったので、次を実行したいプログラムの前に追加してみた。
export PATH=$PATH:/usr/local/bin &&

今回は、portsnap をしてから、 portversion で更新された ports があるか確認をしたかったので、次のように cron を編集した。
30 4 * * 1,5 root /usr/sbin/portsnap update 1> /dev/null && export PATH=$PATH:/usr/local/bin && /usr/local/sbin/portversion -v -L "="

この編集をして、portversionが動くようにしたところ、タイミング良く portupgrade がアップデートされており、pathを通さなくてもportversionが動くようになっていた。なんてこったい。

※ pathが通っていないと判断した理由。
プログラム(portversion)で呼びだすrubyの記述が "#!usr/bin/env ruby" となっており、cron の path が、ruby のある /usr/local/bin に通っていなかった。
このため、env で参照できる path には ruby が存在せず、エラーになっていた模様。

今回のアップデートでは、上記が "#!/usr/local/bin/ruby18" と、ruby が存在する場所を明示的に記述するように変わり、export で path を追加しなくても動くように戻った。

※ 2017-02-19 追記
cronを使って、portsnap update を使うのはリスクがある。
updateと同時に port のビルド・インストールをしていて、その port が変更されてしまうと、トラブルの原因となる。
cron では、 portsnap -I update と "-I"オプションを使うことで、INDEX FILE のみ更新しておくことができる。
面倒だが、portsnap update はビルドする前に実行する方が安全のようだ。