なんとなく

誰得感満載な記事が多いかも。Mono関係とLinuxのサーバ関係、レビューとか。

さくらのVPSでOpenSimを動かす初期設定-2

前エントリ http://d.hatena.ne.jp/takeshich/20120307/1331136918 では、OSgridに接続するところまで記述しました。
本エントリでは自動起動のスクリプトについて記述したいと思います。

内容

  • 自動起動スクリプトの作成
    • screenのインストール
    • スクリプト
    • スクリプトの適用
    • screenのTIPS
    • ハマったところ

自動起動スクリプトの作成

サーバが再起動した際に自動的に実行してくれるようにスクリプトを作成します。
また、

/etc/init.d/osgrid start

で、起動し、

/etc/init.d/osgrid stop

で停止するようにします。

screenのインストール

調べたところ、バックグラウンドで動かすためにOpenSimではscreenを使用するようです。
OpenSimが対話的なプロンプトになるので、明示的にセッションを貼って、裏に回りこませるようです。

[root@foo ~]# yum install screen

OpenSim.exeがあるディレクトリに移動して、
screenコマンドを使って、OpenSimを実行します。

[takeshich@foo bin]$ cd osgrid/bin/
[takeshich@foo bin]$ screen -S osgrid -d -m /opt/novell/mono/bin/mono ./OpenSim.exe

OpenSimを停止する場合は

[takeshich@foo bin]$ screen -S osgrid -p 0 -X stuff 'quit\n'

セッション名を指定してあげます。terminalには表示されませんが、OpenSimは落ちます。

スクリプト

いろいろ試行錯誤して、スクリプト作ってみました。まぁいちから作ったわけではなくて、
http://www.nsl.tuis.ac.jp/svn/opensim/opensim.nsl.tools/trunk/config/opensim_region
のスクリプトを変更しました。ライセンスについて記述がなかったので、もし問題があったら教えてください。*1

#!/bin/bash
#
# osgird
#
# chkconfig: 2345 80 30
# description: osgrid start/stop script

# Source function library.
. /etc/rc.d/init.d/functions

OSGRID=osgrid

OSDIR=/home/takeshich/$OSGRID/bin            # OpenSimをインストールしたディレクトリを指定
PRGFL=/etc/init.d/$OSGRID    # このスクリプトのフルパス
MONO=/opt/novell/mono/bin/mono            # monoへのパス
SLEEPTM=90                          # リスタート時のスリープ時間
CHKTM=30                            # 監視間隔
export MONO_THREADS_PER_CPU=512
ulimit -s 262144

SCRNID=$OSGRID
PIDFL=/var/run/opensim_region_shell$OSGRID.pid

USER=takeshich
EXEFILE=/tmp/tmp$OSGRID.sh


start() {

    echo \#\!/bin/bash > $EXEFILE
    echo export MONO_THREADS_PER_CPU=512 >> $EXEFILE
    echo ulimit -s 262144 >> $EXEFILE
    echo cd $OSDIR >> $EXEFILE
    echo screen -S $OSGRID -d -m $MONO $OSDIR/OpenSim.exe >> $EXEFILE
    chmod +x $EXEFILE

    #EXEFILE=""
    #EXEFILE=$OSDIR/bin/osgrid1_exec.sh
    su $USER -c $EXEFILE
    echo "OpenSim Region Server Start."
    sleep 5

    #make pid-file
    #ps afxu | grep mono |grep -w $OSGRID | awk {'print $2'} > $PIDFL

    #rm -f $EXEFILE
}


stop() {
    su $USER -c "screen -S $SCRNID -p 0 -X stuff $'quit\n' 1> /dev/null 2>&1"
    echo "OpenSim Region Server Stoped."
}


kill_loop() {
    PID=`cat $PIDFL 2> /dev/null`
    if [ "$PID" != "" ]; then
       kill -9 $PID 2> /dev/null
       rm -f $PIDFL
    fi
}


loop_check() {
    kill_loop
    echo $$ >| $PIDFL
    while [ "" = "" ]; do
        sleep $CHKTM
        CHECK=`ps ax|grep SCREEN |grep $SCRNID`
        if [ "$CHECK" = "" ]; then
            start
        fi
    done
}


case "$1" in
  start)
    start
    #/bin/bash $PRGFL check &
    ;;
  stop)
    kill_loop
    stop
    ;;
  restart|reload)
    kill_loop
    stop
    sleep $SLEEPTM
    start
    #/bin/bash $PRGFL check &
    ;;
  *)
    echo $"Usage: $0 {start|stop|restart}"
    exit 1
esac

exit $?

一般ユーザは、takeshichで、実行されるディレクトリの名前をセッション名などに使い回しています。
使用される際は適宜変更してください。

OSGRID=osgrid
USER=takeshich

試した環境としては、一般ユーザtakeshichでログインして、ホームが

[takeshich@foo ~]$ pwd
/home/takeshich

そこで、

[takeshich@foo ~]$ mkdir osgrid
[takeshich@foo ~]$ cd osgrid
[takeshich@foo osgrid]$ wget osgridの実行ファイル
[takeshich@foo osgrid]$ unzip osgridの実行ファイル
[takeshich@foo osgrid]$ cd bin
[takeshich@foo osgrid]$ pwd
/home/takeshich/osgrid/bin

でOpenSim.exeが存在するのが環境です。

スクリプトの適用
[root@foo ~]# cd /etc/init.d/
[root@foo ~]# vi osgrid

スクリプトをコーピーアンドペーストして、保存して、

[root@foo ~]# chmod 755 ./osgrid
[root@foo ~]# chkconfig osgrid on

登録されたか確認します。

[root@foo ~]# chkconfig --list |grep osgrid
スクリプトによる稼動確認
[root@foo ~]# /etc/init.d/osgrid start

で稼働させたあと、

[root@foo ~]# ps aux

一般ユーザでOpenSimが動いていることを確認します。

また、
/home/takeshich/osgrid/bin以下に
OpenSim.logがあるので、

[takeshich@foo bin]$ tail -f ./OpenSim.log

とし、ログが流れることを確認するのもありです。抜けるのは、Ctrl+cです。

screenのTIPS

screenを使用してOpenSim.exeを起動しているので、スクリプトで起動しているプロセスにアタッチすることができます。

[takeshich@foo ~]$ screen -ls

とするとscreenのプロセスが表示されるので

[takeshich@foo ~]$ screen -r プロセス番号

としてあげると、アタッチでき、OpenSimのサーバコマンドなどの入出力が行えます。

また、デタッチ(screenのプロセスから離れるがプロセス自体は死なない)するには、

Ctrl+Dを入力し、続けてaを入力します。
ハマったところ

スクリプトを作成していて、rootでOpenSimを稼働させてしまって、そのあと一般ユーザで動かないということが起きました。それは、rootで実行すると一部のファイルの権限がrootの権限になってしまって、一般ユーザでは権限がなくて使えないという状況でした。

次エントリではiptablesについて記述する予定です。

*1:問題ないこと確認できました。 https://twitter.com/#!/fumi_hax/status/179007554045747203