daemontoolsで勝手にプロセスが終了していたという悲しい状況を防ぐ

Linux

Ruby1.9スクリプト(Twitterbot)をLinuxデーモン化する方法

にて、Rubyスクリプトをデーモン化して、簡単に自動起動と停止できるようにしました。

ですが、何らかの影響で、Rubyスクリプトが終了してしまった場合にスクリプトが落ちたままになってしまいます。これは精神衛生上非常に良くない。

今回は、daemontoolsを使用して、プロセスが終了しても自動的に立ち上げ直す状態をつくります。

よって、名残惜しむことなく、前回つくったデーモンを停止して設定などを削除します。

$ sudo /etc/init.d/tweet stop
$ sudo update-rc -f tweet remove

スポンサーリンク

daemontoolsとは?

daemontoolsとは、バグが無いと有名なqmailの作者であるD. J. Bernstein氏が作成したテーモンの制御ツールです。

デーモンプロセスの監視・制御(起動・停止・管理)とログを収集管理するツール群となっています。

インストール

Ubuntu 10.04へdaemontoolsをインストールします。

$ sudo apt-get install daemontools daemontools-run svtools
$ sudo reboot # svscanを起動するため再起動

無事にインストールされれば以下のようにsvscanが起動しているはず。

$ ps ax | grep svscan
  669 ?        Ss     0:00 /bin/sh /usr/bin/svscanboot
  677 ?        S      0:00 svscan /etc/service
 1362 pts/0    S+     0:00 grep svscan

注意

daemontoolsはフォアグラウンドで動作するソフトウェアのみサポートしています。よって、バックグラウンド動作するソフトウェアには利用できません。

前回、Rubyスクリプトをバックグラウンドで動作するように変更したので、その部分を削除します。

Process.daemon

ユーザー権限で起動するように変更したので、PIDファイルをRuby側で作成する必要もなくなりました。よって、その部分も一緒に消しましょう。

pid = File.open("/var/run/twbot_biz.rb.pid", "w")
pid.write Process.pid
pid.close

daemontoolsは/etc/service/以下にディレクトリを作成し、それぞれのディレクトリを一つのデーモン(サービス)として制御します。

Twitterbot用のディレクトリを作成します。

$ sudo mkdir -p /etc/service/tweet

/etc/service/tweet/run というファイルを作成して、デーモンとなるプロセスを起動する内容を記述します。

/etc/service/tweet/run

#!/bin/sh
exec zsh -c '
  rvm_path=/home/hirocaster/.rvm;
  source /home/hirocaster/.rvm/scripts/rvm;
  rvm use ruby-1.9.2-p136;
  exec setuidgid hirocaster ruby /home/hirocaster/tweet.rb
'

権限等を設定しておきます。

$ sudo chown root:root /etc/service/tweet/run
$ sudo cmod 755 /etc/service/tweet/run

daemontoolsの制御

以上で設定は終了したので実際に起動停止などの制御をします。それぞれは下記の通り。

$ sudo svc -u /etc/service/twbot_biz # start
$ sudo svc -d /etc/service/twbot_biz # stop
$ sudo svc -t /etc/service/twbot_biz # restart

現在のデーモンの状態は以下のように確認できます。

$ sudo svstat /etc/service/tweet
/etc/service/tweet: up (pid 1726) 8745 seconds

実際にプロセスをkillなどして、プロセスが自動的に起動しなおされていることを確認しておきましょう。

$ kill 1726
$ sudo svstat /etc/service/tweet
/etc/service/tweet: up (pid 5003) 2 seconds

これで、勝手にプロセスが死んでも安心ですね。

まとめ

プロセスが死ぬことは良くあることです。こういった対処をしておくことで常に立ち上げておくことが出来ます。いつのまにか止まってました。というのを防ぎましょう。

一方、プロセスが死んでくれないとリソースがあふれる状況があります。死んでも死んでもまた立ち上げられて、さらにリソースが枯渇するなんてことがあります。

daemontoolsはsoftlimitコマンドを利用してメモリ使用量の制限などもできるため、デーモンの稼働を制限しておくことも考慮しましょう。

タイトルとURLをコピーしました