前エントリ 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について記述する予定です。