重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

MinecraftのサーバをLinux上でサービスとして実行しようと思い、最下部に示したシェルを作成し、

# chkconfig --add Minecraft

を実行しました。
再起動を行ってみたところ再起動後もMinecraftのサーバは正常に起動していたのですが、
Minecraftのサーバログを確認すると終了処理が行われず、そのままプロセスがKillされています。


また、

# service Minecraft stop

を実行した場合には正常に終了した事を示すログが出力されていました。


環境は以下のとおりです。
OS:CentOS 5.5(Kernel 2.6.18)
Java:1.6.0_25(64bit)
minecraft_server.jar:beta 1.5_02


何かするべきことが漏れているのでしょうか。
アドバイスよろしくお願いします。


/etc/init.d/Minecraft

#!/bin/sh
# chkconfig:2345 99 01


SCREEN_PATH=/usr/local/bin
SCREEN_NAME=minecraft-server
MINECRAFT_ROOT=/root/Minecraft
DEFAULT_STOP_WATE_TIME=60
MIN_MEMORY=1024M
MAX_MEMORY=4096M

start(){
cd ${MINECRAFT_ROOT}/conf
${SCREEN_PATH}/screen -AmdS minecraft-server java -Xms${MIN_MEMORY} -Xmx${MAX_MEMORY} -jar ../bin/minecraft_server.jar nogui > test.txt
}

stop(){
${SCREEN_PATH}/screen -S ${SCREEN_NAME} -p 0 -X eval "stuff save-all"
while [ ${DEFAULT_STOP_WATE_TIME} -ne 0 ]
do
if test `expr ${DEFAULT_STOP_WATE_TIME} % 30` -eq 0 -o ${DEFAULT_STOP_WATE_TIME} -le 10
then
${SCREEN_PATH}/screen -S ${SCREEN_NAME} -p 0 -X eval "stuff say\040Server\040will\040stop\040in\040${DEFAULT_STOP_WATE_TIME}\040seconds.\015"
fi
DEFAULT_STOP_WATE_TIME=`expr ${DEFAULT_STOP_WATE_TIME} - 1`
sleep 1
done
${SCREEN_PATH}/screen -S ${SCREEN_NAME} -p 0 -X eval 'stuff stop\015'
sleep 10
}

restart(){
stop
start
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0

A 回答 (4件)

あぁ、元の質問で「再起動」と言われていたのは、Minecraft サービスの再起動ではなく、shutdown によるシステムそのものの再起動のことでしたか。



man shutdown
によると、
「All processes are first notified that the system is going down by the signal SIGTERM」

とあるので、

Minecraft サービスの pid を調べて

kill -SIGTERM pid

としてみてください。
これで shell に書かれたとおりの終了処理がなされなかった場合はどうしようもないですね。
(手元の環境 (debian) で実験したら、プロセスを start/stop するシェルの、 stop に書かれた処理(ログにメッセージを吐きだす)は行われました。)
逆に、これで shell に書かれたとおりの 60秒間の終了処理が行われた場合は、shutdown が プロセスに SIGTERM シグナルを送ってから runlevel 0 に移行するまでの時間を、Minecraft の shell が終了処理を行う秒数以上空けてあげれば、システムが runlevel 0 に以降する前に Minecraft の shell の終了処理が完了するのではないでしょうか。

つまり、
shutdown -t 60 -h
(60秒じゃカツカツですね、実際には 70秒くらいでやってみてください)

ところで念のためですが、/etc/inittab の記述は大丈夫ですよね?
    • good
    • 0
この回答へのお礼

ありがとうございます。
kill -SIGTERM pidをしてみたのですが変化が有りませんでした。
仕方ないのでshutdownにリダイレクトするシェルを作成してそのシェル経由でサービスを停止する事にします。

お礼日時:2011/05/19 23:31

一つ忘れてました



>>K01Minecraft は /etc/rc.d/rc[0-6].d のどのディレクトリの下の K01Minecraftを書き換えましたか?
>変更を行ったRunlevelは0,1,6です。

この変更は元に戻しておいてくださいね。
    • good
    • 0

>(1)正常に終了処理が実行される。


>(2)正常に終了処理が実行される。
>(3)正常に終了処理が実行される。

そうですか。
どうやら、service コマンドが、

restart)
restart

を正しく処理してないようですので、
まずは、

restart)
start
stop

の変更はこのままでよいということになりそうですね。


>またK01MinecraftをS01Minecraftにリネームし、
>リンク先を"/etc/init.d/Minecraft stop"に変更しても
>終了処理は実行されていません。

リンク先は、"/etc/init.d/Minecraft" の書き間違いだと思いますが、
K01Minecraft は /etc/rc.d/rc[0-6].d のどのディレクトリの下の K01Minecraftを書き換えましたか?
runlevel コマンドで、現在の runlevel の数字が表示されます。
それに該当する数字の /etc/rc.d/ 以下の K.... を S... に変更しないと、その runlevel に対して有効になりません。
runlevel 0 は シャットダウン、6 はリブート、1 はシングルユーザーモードなので、この3つは気をつけてください。

CentOS であれば、

chkconfig Minecraft on

とコマンドを打てば、自動的に各 runlevel に対して適切に K... を S... にしてくれるはずです。

また、S01Minecraft の "01" は適正ですか?
SXXの数字の順でサービスが立ち上がるのですが、Minecraft は 01 番目に立ちあげても大丈夫ですか?
これでは、syslog や network サービスよりも先に立ち上がることになりますが・・・。
私は、後で自分で追加したサービスは、特に起動順序が最初でないといけないというもののでなければ、
S99 くらいにして、他のサービスが立ちあがった後で最後に立ちあがるようにしています。

この回答への補足

いくつか説明漏れがあって申し訳有りません。

1./etc/init.d/Minecraftを変更する前からservice Minecraft restart,service Minecraft stopは正常に終了処理が行われる。
2.shutdown -h nowやshutdown -r nowでは正常に終了処理が行われずallkillによってプロセスが殺される。
という状況です。

>K01Minecraft は /etc/rc.d/rc[0-6].d のどのディレクトリの下の K01Minecraftを書き換えましたか?
変更を行ったRunlevelは0,1,6です。
この場合終了処理を行いたいため、
S始まりのシンボリックリンクにstopオプション付で実行を行ってみた次第です。

こちらの説明ミスによりお時間をいただいた上に、解決でき無い形となって申し訳有りません。
sleepコマンドが存在する事が原因の可能性を考慮してShellを書き換えてみようと思います。

補足日時:2011/05/07 04:42
    • good
    • 0
この回答へのお礼

この件の原因が判明しました。
/etc/rc.d/rcがシャットダウンコマンドを実行する際に、
下記パスにロックファイルが存在している事を確認しています。
下記パスのロックファイルが存在している場合に限りストップコマンドを実行しています。
(恐らくシャットダウン高速化のため)

■ロックファイル
/ver/lock/subsys/サービス名

対処としては下記の2行をstart()とstop()に追記する事でストップコマンドを実行させる事が出来ます。

■start()に追記する行
touch /ver/lock/subsys/Minecraft

■stop()に追記する行
rm -f /ver/lock/subsys/Minecraft

お礼日時:2012/06/13 21:41

Minecraft は知りませんが、shell スクリプトに特に問題はなさそうですね。



あまり意味がないような気がしますが,]

(1)
/etc/init.d/Minecraft restart

とやると、シャットダウン処理はどうなりますか?

(2)
それでも変化ない場合、case 文の

restart)
restart



restart)
start
stop

に書き換えて、service Minecraft restart を実行するとどうなりますか?

(3)
上記(2)のままで、

/etc/init.d/Minecraft restart

を実行すると、どうなりますか?

この回答への補足

実験の結果ですが、
(1)正常に終了処理が実行される。
(2)正常に終了処理が実行される。
(3)正常に終了処理が実行される。
のようになりました。

また2の変更を行った状態で、
shutdown -r now
を行ったところ終了処理が実行されていません。

またK01MinecraftをS01Minecraftにリネームし、
リンク先を"/etc/init.d/Minecraft stop"に変更しても
終了処理は実行されていません。

以上のような状況です。
よろしくお願いします。

補足日時:2011/05/05 05:31
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!