Macにdaemontoolsインストール

参考

sudo port install daemontools


起動スクリプトを置くディレクトリを作っておく

sudo mkdir /service
sudo chmod 755 /service


試しにdaemon化するスクリプトtwitterのchirp stream APIでタイムラインを取得してgrowlに表示する。jugyoさんのnotifyを使っているのでmac以外でもgrowl的な物で動くはず。
chirpstream-growl.rb

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'net/http'
require 'uri'
require 'json'
require 'yaml'
require 'notify'

conf = YAML::load open(File.dirname(__FILE__)+'/config.yaml')

uri = URI.parse('http://chirpstream.twitter.com/2b/user.json')
Net::HTTP.start(uri.host, uri.port) do |http|
  req = Net::HTTP::Get.new(uri.request_uri)
  req.basic_auth(conf['user'], conf['pass'])
  http.request(req){|res|
    next if !res.chunked?
    res.read_body{|chunk|
      status = JSON.parse(chunk) rescue next
      #next if !status['text']
      user = status['user']
      begin
        puts "#{status['user']['screen_name']}: #{status['text']}"
        Notify.notify(status['user']['screen_name'], status['text'])
      rescue
        p status
      end
    }
  }
end

これをまず単体で普通に動かしてみて、ちゃんと動くのを確認
/Users/sho/src/ruby/twitter-stream-api/chirpstream-growl.rb に置いて自分の権限で動かす。


次にdaemontoolsの起動スクリプトを登録する。
ディレクトリを準備

sudo mkdir -p /service/chirp/log/main
sodo touch /service/chirp/run
sudo touch /service/chirp/log/run
sudo chmod +x /service/chirp/run
sudo chmod +x /service/chirp/log/run
sudo chown sho:staff /service/chirp/log/main


起動スクリプト
/service/chirp/run

#!/bin/sh
exec setuidgid sho ruby /Users/sho/src/ruby/twitter-stream-api/chirpstream-growl.rb

setuidgidで自分の権限でコマンド実行される


multilogでのログ取り起動

#!/bin/sh
exec 2>&1
exec setuidgid sho multilog t ./main


準備ができたらdaemontoolsのsvscanを起動

sudo svscan /service


プロセスの状態を見る。ワイルドカードで全部見る。

sudo svstat /service/chirp/
sudo svstat /service/*


個別に終了したりする

sudo svc -d /service/chirp/ # 停止
sudo svc -u /service/chirp/ # 起動
sudo svc -t /service/chirp/ # 終了

ためしにプロセスを停止してみて、数秒後psしてみたら復活していた。正常に動いている。

ps aux | grep chirp
kill 番号


Mac起動した時にsvscanを自動起動したい
インストールログにmac用のplistがあった

###########################################################
# A startup item has been generated that will aid in
# starting daemontools with launchd. It is disabled
# by default. Execute the following command to start it,
# and to cause it to launch at startup:
#
# sudo launchctl load -w /Library/LaunchDaemons/org.macports.svscan.plist
###########################################################


さっそく登録

sudo launchctl load -w /Library/LaunchDaemons/org.macports.svscan.plist

svscan.plistの中を見ると、svscan-pathwrapperからsvscanを起動している
svscan-pathwrapperがsvscanのサービスのディレクトリを指定してないので修正

/opt/local/sbin/svscan-pathwrapper

#!/bin/sh
#

export PATH=/opt/local/bin:/opt/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin
#exec /opt/local/sbin/svscan $* # これが元からあったやつ
exec /opt/local/sbin/svscan /service # 修正版

これでMac再起動したら自動でgrowltwitter見れる・・
と思ったらWiFiつながる前にchirpstream-growl.rbが実行されてつながってないのにプロセス起動しっぱなしだった

再起動したら動いた。

sudo svc -du /service/chirp/