cronで動かしていたプログラムが "env: ruby: No such file or directory" というエラーを吐いて動かなくなった。
コマンドラインから動かすときは問題はおきず、cronからのみ。cronのpathが通っていない(※)ようだ。
FreeBSDの場合、/etc/crontab の中にある PATH を編集してやる方法がある。
今回は、特定のプログラムさえ動けばいいので、部分的にpathを通す方法を探した。
/usr/local/binをpathに追加したかったので、次を実行したいプログラムの前に追加してみた。
今回は、portsnap をしてから、 portversion で更新された ports があるか確認をしたかったので、次のように cron を編集した。
この編集をして、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 はビルドする前に実行する方が安全のようだ。
コマンドラインから動かすときは問題はおきず、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 はビルドする前に実行する方が安全のようだ。