DDNS 問題解決の奇策?

DDNS 問題解決の奇策?

- Shinobar Martinek の投稿
返信数: 5

バグレポート ダイナミックDNSにおけるTP障害について などで報告しているように、Dynamic DNSを用いた自宅サーバーにおいて、自宅サーバーのIPが変更されると、テレポートに障害が出ます。この問題の調査は継続中ですが、シノバーのSIM群では次のような応急的対処をしています。参考までに紹介します。

要はROBUSTサーバーなどにDNSを引かせないように、Region.ini に記載される ExternalHostName にFQDNではなく、直接グローバルIPを書き込んでしまいます。

添付のスクリプトは SIMサーバー起動時にグローバルIPを調べ、Regions.ini を書き換えます。グローバルIPが変わるたびにこのスクリプトを起動すればよいのですが、現在はこのスクリプト起動を手動で行ってますす。SIMサーバーを外から正常終了させる方法が分からないので。良い方法があればお教えください。killall mono とかで強制的にシャットダウンさせても問題はないのかも?

添付スクリプトで外部IPの取得には icanhazip.com を利用してます、IPアドレスを返してくれるようです。特権ユーザ rootで動作するパピーリナックスで書いていますので、SIMサーバーを非特権ユーザである opensim で実行するよう細工しています。もともと非特権ユーザで起動される環境では、そこのところは修正してください。シェルは bash です、

#!/bin/sh

# see my location
MYNAME=$(basename $0)
TMPFILE=/tmp/$MYNAME.txt
APP=$(readlink -e $0)
[ "$APP" ] || APP=$0
APPDIR=$(dirname "$APP")
[ "$APPDIR" = "." ] && APPDIR=$(pwd)
GUEST_PREFIX=$APPDIR/opensim-0.8.2.1-jog
GUEST_BINDIR=$GUEST_PREFIX/bin
REGIONFILE=$GUEST_BINDIR/Regions/Regions.ini

#rewrite IP
if [ ! -r "$REGIONFILE" ]; then
  echo "'$REGIONFILE' not found."
  exit 1
fi
if [ ! -w "$REGIONFILE" ]; then
  echo "'$REGIONFILE' rewriting denied.."
  exit 1
fi
echo "Trying to get the external IP..."
EXTERNALIP=$(wget -t 3 -O - -q icanhazip.com)
if [ -z "$EXTERNALIP" ]; then
  echo "External IP cannot obtained."
  exit -1
fi
sed -e 's/ExternalHostName.*$/ExternalHostName = '$EXTERNALIP'/g' "$REGIONFILE" > "$TMPFILE"
if [ ! -s "$TMPFILE" ]; then
  echo "Rewriting failed."
  exit 1
fi
mv -f "$TMPFILE" "$REGIONFILE"
echo "'$REGIONFILE' updated."

# clear old stuff
rm -f "$GUEST_BINDIR"/OpenSim.log*
rm -fr "$GUEST_BINDIR"/assetcache

#launch opensim
chown opensim.opensim -R "$GUEST_BINDIR"
export PATH="$PATH:$GUEST_BINDIR"
export HOME="$APPDIR"
cd "$GUEST_BINDIR"
sudo -u opensim mono OpenSim.exe
Shinobar Martinek への返信

Re: DDNS 問題解決の奇策?

- Iseki Fumikazu の投稿

OpenSim は フォアグランド起動なんでしょうか?

リモートコンソールを使う手もあるようですが,screen とか tmux を使ってバックグラウンド起動すれば,スクリプトからOpenSimを止められます.
ただし,完全に落ちない場合も時々あります(終了プロセスが途中で止まってしまう).

JOGでは現在 tmux を使用しています.

なお,書き込みデータのキャッシュが破棄されるので,いきなり mono をkill するのは通常はやらない方が良いと思います.
終了プロセスが途中で止まってしまった場合は,mono を kill するしかありませんが.

Iseki Fumikazu への返信

外部スクリプトからのSIMサーバーの停止

- Shinobar Martinek の投稿

ご教示ありがとうございます。screen コマンドで SIMサーバーを起動しておき (opensim はセッションの名前。jogrid_rewriteip はSIMサーバー起動スクリプト)

screen  -S opensim -X exec jogrid_rewriteip

別のターミナルから

 screen -S opensim -X eval 'stuff quit\015'

とすれば、正常終了できることを確認しました。

screen の使い方はよく分かってません。他に良い方法があるのかもしれません。

Shinobar Martinek への返信

Re: 外部スクリプトからのSIMサーバーの停止

- Dover Kimiko の投稿

TUIS発行の「OpenSimサーバーシステム構築入門(フリーダウンロードPDF)のP53-P58に、screenコマンドを使ってバックグラウンドでOpensimの各サーバーを起動・停止させるスクリプトが記載されていました。 私はこれを利用させていただいてます。

PDFのダウンロードURLを貼り付けようとしたのですが、ここはコピペが動作しません。。。。><

「TUIS」と「Opensim」のキーワードで検索すれば、該当URLが出てきます ^^)

 

Dover Kimiko への返信

Re: 外部スクリプトからのSIMサーバーの停止

- Shinobar Martinek の投稿

ありがとうございます。もとちゃさんのブログでも触れていた、これですね。

http://www.nsl.tuis.ac.jp/DownLoad/etc/opensim_man_1.1.0.pdf

ずっと前にダウンロードしましたが、読んでませんでした。m(_ _)m

冒頭に目次など10ページほどあるので、ページ数がずれていて、該当個所はPDFファイル63ページあたりからでした。

前記スクリプト最終行で

screen -dmS opensim sudo -u opensim mono OpenSim.exe

としてバックグラウンンド起動し(sudo によりユーザー opensimで実行。スクリーン名も opensim)、別のターミナルで

screen -S opensim -p 0 -X stuff $'quit\n'

で正常終了することを確認しました。

 

 

Shinobar Martinek への返信

Re: 外部スクリプトからのSIMサーバーの停止

- Iseki Fumikazu の投稿

現在 JOGで使用しているスクリプトは以下の通りです.

データベース増大の原因の generate map はコメントアウトしています (^^;

 

#!/bin/bash
#
# opensim_region (OpenSim Region Server) using tmux
#                                                    by Fumi.Iseki
#

OPNSM=OpenSim.exe                   # 起動するプログラム
OSDIR=/usr/local/opensim            # OpenSim をインストールしたディレクトリを指定
PRGFL=/etc/init.d/opensim_region    # このスクリプトのフルパス
MONO=/usr/local/bin/mono            # mono へのパス
SLEEPTM=15                          # リスタート時のスリープ時間 (s)
CHKTM=30                            # 監視間隔 (s)
CNTMX=60                            # ハングアップ監視回数.判定時間は $CNTMX * $CHKTM (s)
#OPTION="--server"

export PATH=/usr/local/bin:$PATH
export MONO_THREADS_PER_CPU=512


SCRNID=opensim_region
PIDFL=/var/run/opensim_region_check.pid


start() {
    echo "OpenSim Region Server Start."
    tmux new -d -s $SCRNID -c $OSDIR/bin "$MONO $OPTION $OPNSM"
}       


stop() {
    tmux send-keys -t $SCRNID C-m "quit" C-m 
    echo "OpenSim Region Server Stoped."
}


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


start_check() {
    kill_check
    echo $$ >| $PIDFL
    PRVTM="0:00"
    COUNT=0
    #
    while [ "" = "" ]; do
        CHECK=`ps ax|grep tmux |grep $SCRNID`
        if [ "$CHECK" = "" ]; then
            start
            PRVTM="0:00"
            COUNT=0
        else
            CHECK=`ps ax|grep $MONO |grep $OPNSM |grep -v tmux`
            EXETM=`echo $CHECK | awk -F" " '{print $4}'`
            if [ "$PRVTM" = "$EXETM" ]; then
                COUNT=`expr $COUNT + 1`
                if [ $COUNT -ge $CNTMX ]; then
                    tmux send-keys -t $SCRNID C-m "quit" C-m 
                    sleep $CHKTM
                    PID=`echo $CHECK | awk -F" " '{print $1}'`
                    kill -9 $PID
                else
                    tmux send-keys -t $SCRNID C-m "show stats" C-m 
                    #tmux send-keys -t $SCRNID C-m "generate map" C-m 
                fi
            else
                COUNT=0
            fi
            PRVTM=$EXETM
        fi
        #
        sleep $CHKTM
    done
}


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

exit $?