これは私が書いた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