at posts/single.html

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...の行) をシングルクォーテーションで括っていてうまく動かずにずっと悩んでいた。

関連する日記