Macにdaemontoolsインストール
参考
- 私家版 daemontools FAQ (1/3) しくみがわかりやすい
- 少年よ大志を抱け: やっぱりdaemontoolsが好き
- ウノウラボ Unoh Labs: 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再起動したら自動でgrowlでtwitter見れる・・
と思ったらWiFiつながる前にchirpstream-growl.rbが実行されてつながってないのにプロセス起動しっぱなしだった
再起動したら動いた。
sudo svc -du /service/chirp/