2012-01-01 12 views
0

私はCentOS上のWebmin経由でMinecraftサーバーを起動するために起動スクリプトを使用しています。サーバー自体を起動する前に、いくつかのファイルをバックアップします。最近、私たちは誤ってスクリプトを2回連続して実行してデータを混乱させました。その結果、Minecraftサーバーの2つのインスタンスが実行され、すべてがデータファイルなどで結ばれました。処理が既に実行されている場合はbashスクリプトを終了します

これを防ぐために、プロセスが実行されていることを検出すると、スクリプトを終了させます。私は同様の問題を捜し求めました。ロックファイルのようなものが示唆されていますが、起動スクリプトはMinecraftサーバープロセス用の画面を設定するだけなので、それらを削除する機会はありません。画面を終了させるか、またはingameコマンドによってサーバーを停止する。

サーバ・プロセスは、このコマンドを使用して開始されます。

screen -dmS minecraft java -Xincgc -Xmx2G -jar server.jar 

は、どのように私はこのプロセスがすでに実行されている場合は、起動スクリプトを検出することができ、その後、自分自身を終了?

答えて

3

は、このスクリプトを使用します。

#!/bin/bash 
LOCKDIR="/path/to/lockdir" 

if [ ! mkdir "$LOCKDIR" ]; then 
    echo >&2 "Server is already running" 
    exit 1 
fi 

# Here: when exiting, or receiving any of the mentioned signals, remove the lock file    
trap "rmdir \"$LOCKDIR\"" exit INT HUP TERM QUIT 
  
# It would be tempting to exec instead, but DON'T DO IT: otherwise the trap is forgotten 
minecraft java -Xincgc -Xmx2G -jar server.jar 

exit $? 

をし、画面の中でそれを起動します。

+2

ロックを作成するためのこの方法は、それはアトミックではありませんので、あなたがこれを見、 'mkdir'を使用する必要があります間違っています。 wooledge.org/BashFAQ/045 –

+0

'' screen'セッション内で 'trap'を設定する必要はありませんか?私はあなたが 'screen -dmS minecraft'をスクリプトの中から削除する必要があると思って、' screen -dmS minecraft minecraft-script.sh'のように呼び出されます。いいえ? – ruakh

+0

Samus_のロックディレクトリの提案が機能していないようです。私はディレクトリチェックを実装しましたが、画面の起動直後に終了したようです。 – Clavus

関連する問題