0

これは私が書いたbashスクリプトで、crontabで指定された間隔でMinecraftサーバーのすべてのワールドを自動的にトリミングします。「/wb$WORLDtrim」コマンドと「/wbtrimconfirm」コマンドを各ワールドで1つずつ実行します。ここで、$WORLDは現在作業中のワールドです。ファイルのリストから各ワールドをforループにロードすることにより、各ワールドを順番にトリミングします。現在、ワールドトリミングにはさまざまな時間がかかる可能性があるため、各ワールドに割り当てられるのは30秒しかないため、まだ完了していない場合に停止しないように指示する方法がわかりません。ログファイルを読み取ってコマンドのステータスを取得することは機能する可能性があると思いますが、その方法が正確にはわかりません。「grep」や「awk」のようなものでうまくいくと思いますが、それがうまくいくかどうかはわかりませんが、これはかなり複雑な障害のようです。何か案は?投稿された世界をトリミングしながら印刷するログファイルの一部がありますここペーストビンで。また、このスクリプトを改善するために私ができること以外に何かありますか?私はコードを書いているのはほんの数ヶ月で、それほど頻繁ではないので、プログラミング/スクリプティング全般に慣れていません。

#!/bin/bash
# Title: World Border Trim Automator
# Author: Jonathan Bondhus

######### CONFIG STARTS HERE #########

# Location of the init script
INIT_SCRIPT="/etc/init.d/minecraft"

# Name to use for the screen instance
SCREEN="minecraft"

# User that should run the server
USERNAME="minecraft"

# Path to minecraft server directory 
MCPATH="/home/${USERNAME}/minecraft"

# Where the worlds are located on the disk
WORLDSTORAGE="${MCPATH}/worlds"

######### CONFIG ENDS HERE #########

## Start of script, don't edit anything below this line unless you know what you are doing

as_user() {
    if [ $ME == $USERNAME ] ; then
        bash -c "$1"
    else
        su $USERNAME -s /bin/bash -c "$1"
    fi
}

my_trim() {
    a=1
    for NAME in $(ls $WORLDSTORAGE)
    do
        if [ -d $WORLDSTORAGE/$NAME ]
        then
            WORLDNAME[$a]=$NAME
            a=$a+1
            # Run the /wb trim command
            echo "Running /wb $NAME trim..."
            as_user "screen -p 0 -S $SCREEN -X eval 'stuff \"wb $NAME trim\"\015'"
            sleep 2     # Wait 2 seconds
            clear
            echo "Running /wb trim confirm..."
            as_user "screen -p 0 -S $SCREEN -X eval 'stuff \"wb trim confirm\"\015'"
            sleep 1
            clear
            echo "Waiting 30 seconds for trim to complete..."
            sleep 30    # Wait 30 seconds
        fi
    done
}

my_is_running(){
    # Checks for the minecraft servers screen session
    # returns true if it exists.
    if ps ax | grep -v grep | grep "$SCREEN $INVOCATION" > /dev/null
    then
        return 0
    fi
    return 1
}

my_main(){
    ME=`whoami`     # Sets $ME to equal the current user's username
    my_is_running
    if my_is_running
        then
            my_trim
        else
            echo "Server is not running... Starting..."
            my_as_user "$INIT_SCRIPT start"
            wait 100
    fi
}

my_as_user() {
    if [ $me == $username ] ; then
        bash -c "$1"
    else
        su $USERNAME -s /bin/bash -c "$1"
    fi
}

my_main
exit 0
4

2 に答える 2

0

「画面」内で「もの」を実行している理由はありますか?

削除した場合、「stuff」は同期的に実行され、コマンドの完了後に戻ります。

my_trim() {
    a=1
    for NAME in $(ls $WORLDSTORAGE)
    do
        if [ -d $WORLDSTORAGE/$NAME ]
        then
            WORLDNAME[$a]=$NAME
            a=$a+1
            # Run the /wb trim command
            echo "Running /wb $NAME trim..."
            as_user "stuff \"wb $NAME trim\"\015" # will block here until stuff returns
            #sleep 2     # no reason this any more
            clear
            echo "Running /wb trim confirm..."
            as_user "stuff \"wb trim confirm\"\015"
            #sleep 1
            clear
            echo "Done"
            #sleep 30
        fi
    done
}
于 2012-06-17T14:44:42.387 に答える