Unity Cache Serverを使う。 CentOS6/7でのサービス作成の話
Unityのアセットインポートって結構時間かかりますよね…。
多数のファイルをうっかりインポート始めてしまったために数時間作業を中断するはめに…という経験のある人もいるかと思います。
そんな時役立つのがUnity Cache Server。Editor上で一度インポートしたアセットのデータをキャッシュしてくれるサーバプログラムです(Unity Pro限定)。
Unity - マニュアル: キャッシュサーバー (チームライセンス)
Proライセンスを持っていてある程度の規模のプロジェクトを回している人は大抵使っているのではと思います。
Cache Serverのプログラムをネットワークのどこかのマシン(サーバ)で動かしておき、 Unity EditorでCache Serverの設定をしている状態でアセットのインポートをすれば、そのインポートデータが自動的にサーバにキャッシュされます。 その後同じアセットをインポートする際、インポート処理を行う代わりにキャッシュデータを勝手にダウンロードしてくれるので、インポート時間の節約になるのです。 例えば開発チームのメンバー間で同じプロジェクトを共有して作業する場合、 またマルチプラットフォーム向けの開発をしていてSwitch Platformを頻繁に行う場合などに非常に効果があるわけです。
さて、今回はこのCache ServerプログラムをCentOS6と7のサーバマシン上でサービスとして動かす手順をまとめてみたいと思います。 Unityの話というよりはCentOS(RedHat系linux)でのサービス作成方法の話ですね。
Cache Serverの入手・実行(サーバ上の操作)
とりあえずCache Serverをサーバ上にダウンロードして実行する所から始めます。
ダウンロード場所が少し分かりにくいですが、ダウンロードページの「追加ダウンロード」を押すとリンクが出てきます。
パッチリリースのページにもあります。Windows向けとMac向けで2つリンクがありますがどちらも内容は同じ?
Unity - Unity QA - Patch Releases
こうしてダウンロードしたプログラムをサーバ上で動かすことで利用できます。 サーバはいわゆるサーバ専用機でなくても、作業するマシンから参照可能なネットワーク上にあり、 ディスク・メモリに余裕のあるマシンなら大丈夫です。 極端な話、作業するマシン上で動かしてもかまいません。 ただしマニュアルページにも書いてありますが、 ファイルシステムの関係上WindowsではなくMacかLinuxを使うべしとのことです。 今回はCentOSなのでOKですね。
zipファイルを解凍してできたディレクトリにRunLinux.shというシェルスクリプトが用意されているので、 シェル上でこれを実行するだけでOKです。
Cache Serverの利用(Unity Editor上での操作)
実際に作業するUnity Editor上では、(WindowsではEdit、MacではUnityの下から)Preferencesダイアログを開き、Cache Serverタブを選択。 「Use Cache Server」にチェックを付け、「IP Address」にサーバのアドレスを入れます。 もし正しくサーバプログラムが動いており、ネットワーク越しにアクセス可能であれば[Check Connection]ボタンを押した時にConnection Successfulと出ます。
この設定が完了した状態でアセットのインポートが起きた場合に、サーバ上へインポート済みデータがキャッシュされるようになります。 ある少し大きめのファイルをインポートする際、1回目はインポートに少し時間がかかりますが、 2回目以降はキャッシュを利用するためインポート時間が短縮されているかと思います。
CentOS6でのCache Serverのサービス作成
さて、基本的には上記のRunLinux.shをnohupコマンドを使うなどしてバックグラウンドで走らせれば利用可能になるですが、 この状態だとサーバプログラムが稼働しているかの確認や、プログラムの停止などが少し面倒だし、 サーバを再起動するなどした場合に、Cache Serverもいちいち立ち上げ直す必要があります。 このようにずっと立ち上げておくタイプのプログラムはサービスとして登録しましょう。 起動・停止や自動起動の設定などが簡単にできるようになります。 では、Cache Serverのプログラムをサービスに登録していきたいと思います。
まず前準備として、Cache Serverプログラムを解凍してできるディレクトリを/opt/CacheServerとして配置します。 また、/opt/CacheServer以下にキャッシュデータを置くものとし、 そのためにCacheServer以下のディレクトリ所有者をサービスを実行するユーザ(ここでは仮にunitysrvとします)に変更しておきます。
# unzip CacheServer-5.3.4p6.zip # mv CacheServer /opt/ # chown -R unitysrv:unitysrv /opt/CacheServer/
CentOS6上でサービスを作成するには、/etc/init.d以下に起動・停止を行うシェルスクリプト(initスクリプト)を記述します。 ラッキーなことに以下のページにスクリプト例がありました。
Cache server installation on CentOS | Unity Community
これを少し修正して以下のようにしました。
#!/bin/sh ### BEGIN INIT INFO # Provides: unity_cache_server # Required-Start $network $remote_fs # Required-Stop: $network $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Unity Cache Server. # Description: Unity Cache Server provides fast importing # of assets that have already been processed by any member of the team. ### END INIT INFO if [ -f /etc/init.d/functions ]; then # Source function library. . /etc/init.d/functions else echo_success () { echo -n " [ OK ] "; } echo_failure () { echo -n " [FAILED] "; } fi if [ -f /etc/sysconfig/network ]; then # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ X\${NETWORKING} = Xno ] && exit 0 fi ## # UnityCacheServer startup script ## ################################################################################ ## EDIT FROM HERE ################################################################################ # Installation prefix PREFIX="/opt/CacheServer" # Username to run as CSUSER="unitysrv" CACHEDIR=$PREFIX/cache5.0 LEGACYCACHEDIR=$PREFIX/cache # Arguments ARGS="--path $CACHEDIR --legacypath $LEGACYCACHEDIR" ################################################################################ ## STOP EDITING HERE ################################################################################ # The path that is to be used for the script PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin PROG="unity_cache_server" DAEMON_APP=$PREFIX/RunLinux.sh DAEMON="nohup $DAEMON_APP $ARGS > /dev/null 2> /dev/null &" RETVAL=0 PID="" getpid() { PID=`ps ax | grep $PREFIX | grep -v grep | awk '{print $1}'` } start () { getpid if [ $PID ]; then echo $"$PROG (pid $PID) is already running." return 0 fi echo -n $"Starting $PROG: " su -l $CSUSER -c "$DAEMON" RETVAL=$? if [ $RETVAL -eq 0 ]; then echo_success echo else echo_failure echo exit 1 fi } stop () { getpid if [ ! $PID ]; then echo $"$PROG is not running." return 0 fi echo -n $"Stopping $PROG: " su -l $CSUSER -c "kill $PID" RETVAL=$? if [ $RETVAL -eq 0 ]; then echo_success else echo_failure fi echo } restart () { stop start } dostatus() { getpid if [ $PID ]; then echo $"$PROG (pid $PID) is running." else echo $"$PROG is not running." fi } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) dostatus ;; restart) restart ;; *) echo "Usage: unity_cache_server {start|stop|status|restart}" exit 1 esac exit $RETVAL
このファイルを/etc/init.d/unity_cache_serverとして保存し、 実行権限を与えてサービスをスタートします。
# chmod +x /etc/init.d/unity_cache_server # service unity_cache_server start Starting unity_cache_server: [ OK ]
OKと出れば起動成功です。
これでさらにchkconfig --addで自動起動設定を追加。chkconfig --listで確認してランレベル2、3、4、5がonになっていれば大丈夫です。
# chkconfig --add unity_cache_server # chkconfig --list unity_cache_server unity_cache_server 0:off 1:off 2:on 3:on 4:on 5:on 6:off
CentOS7でのサービス作成
CentOS7ではサービスの登録はsystemdを使います。 CentOS6の場合のようなシェルスクリプトを書くのではなく、 ディレクトリ/etc/systemd/systemに次のような設定ファイルを配置することでサービスを定義します。
[Unit] Description=Cache Server for Unity After=syslog.target network.target [Service] Type=simple ExecStart=/opt/CacheServer/RunLinux.sh --path /opt/CacheServer/cache5.0 --legacypath /opt/CacheServer/cache WorkingDirectory=/opt/CacheServer KillMode=process Restart=always User=unitysrv Group=unitysrv [Install] WantedBy=multi-user.target
この内容の設定ファイルを/etc/systemd/system/unity_cache_server.serviceという名前で保存します。 設定ファイルの詳細なフォーマットは省略しますが、要はExecStartで指定したコマンドを実行してくれます。 CentOS6のシェルスクリプトに比べて非常にシンプルに記述できるのでいい感じですね!
さて、ではサービスの登録・スタートを行います。 systemctl enableでサービス登録、systemctl startでサービススタートです。
# systemctl enable unity_cache_server.service # systemctl start unity_cache_server.service
systemctl statusで稼働状態を確認しましょう。「Active: active (running)」と出ていればOKです。
# systemctl status unity_cache_server.service ● unity_cache_server.service - Cache Server for Unity Loaded: loaded (/etc/systemd/system/unity_cache_server.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2016-05-17 23:50:49 JST; 30s ago Main PID: 2078 (node) ...
これでサーバマシンを再起動した時にCache Serverも自動的に立ち上がるようになります。 さらに設定ファイル内のRestartを適当に設定しておけばプログラムが不正終了しても プログラムを立ち上げ直してくれます。
# ps ax | grep CacheServer 2078 ? Ss 0:00 /opt/CacheServer/builds/linux64/bin/node /opt/CacheServer/main.js --path /opt/CacheServer/cache5.0 --legacypath /opt/CacheServer/cache 2167 pts/0 R+ 0:00 grep --color=auto CacheServer # kill 2078 # ps ax | grep CacheServer 2168 ? Ss 0:00 /opt/CacheServer/builds/linux64/bin/node /opt/CacheServer/main.js --path /opt/CacheServer/cache5.0 --legacypath /opt/CacheServer/cache 2174 pts/0 R+ 0:00 grep --color=auto CacheServer
Cache Serverのプロセスをkillしても再び立ち上がっていますね。
これでUnityのキャッシュサーバがいつでも使えます!!