Macのlaunchdからrbenv環境のRubyスクリプトを起動する
Mac OS X では cron の代わりに launchd を使ってプログラムを起動することができる。 rbenv を使っている環境で launchd から Ruby スクリプトを起動できるか試してみた。
launchd とは
cron, initd, inetdを高機能にしたもの。時刻、ネットワーク接続など、様々な条件でプログラムを起動することができる。
rbenv環境で動かす時の指定方法
たとえば update_rubygems
コマンドを毎日実行する設定はこうなる。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>jp.machu.update_rubygems</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>-c</string>
<string>export PATH="$HOME/.rbenv/bin:$PATH"; eval "$(rbenv init -)"; update_rubygems</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Day</key>
<integer>1</integer>
</dict>
</dict>
</plist>
ProgramArguments
に直接 update_rubygems
指定するのではなく、 bash -c
経由で実行しているところがポイント。要は、rbenvを普通に使うときにシェルに指定している以下のコマンドを実行しているのと同じ。
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
最初、第3引数 (export PATH...の行) をシングルクォーテーションで括っていてうまく動かずにずっと悩んでいた。