Skip to content

Instantly share code, notes, and snippets.

@lo48576
Last active December 14, 2015 12:59
Show Gist options
  • Select an option

  • Save lo48576/5090199 to your computer and use it in GitHub Desktop.

Select an option

Save lo48576/5090199 to your computer and use it in GitHub Desktop.
utilities for @No_961
ファイル置いてく。あと解説
startmine.sh, minebackup.sh, backup_install.sh は/home/no961/mc/ に置く。
startmine.sh:
これを使ってマイクラ鯖プロセスを起動する。Ctrl+Cで終了。
起動時にramdiskを4GiB確保(実際は、使用される分だけメモリが動的に確保され、その最大が4GiB)。
なお、この容量は変更可能。スクリプト見ればわかる。
また、正常終了/強制終了に関わらず、スクリプト終了の際にデータをHDD側に同期し、ramdiskを開放。
ramdisk確保の際にroot権限が必要なため、パスワードを求められるが、マイクラ鯖自体は特権を用いずに起動される。
また、実行ファイル(jarファイル)自体もramdiskにコピーされ、そちらの方のが起動される。
minebackup.sh:
バックアップを実行するスクリプト。
30分ごとに自動で呼び出され、「minecraft_server.jar」という文字列を含むプロセスが実行されているときに
バックアップする。
「file minecraft_server.jar」とかが起動されていてもバックアップは実行されてしまうので注意。
backup_install.sh
定期バックアップを導入するスクリプト。
installとはいっても、cronのためのファイルをコピーするだけである。
$ ./backup_install.sh
でパスワードを求められるので入力するとrootとしてシステムにファイルを1つだけ導入する。
$ ./backup_install.sh uninstall
でアンインストール(ファイルを削除するだけ)もできるので安心。
設定すべきこと:
minestart.shではramdiskの方のjarファイルが実行されるようにした。
今までは~/mc/以下のデータをロードしていたかもしれないが、これからは/mnt/ramdisk-minecraft/以下(これはスクリプトを編集すれば変更可能)に
コピーされたデータをロードしなければならない。
「実行ファイルと同じディレクトリ以下にあるデータが自動でロードされる」のなら問題ないのだが、
もし「~/mc/以下のデータをロードする」と名指しになっている場合は設定変更が必要。
たとえば今まで~/mc/data/のデータが使用されていたとすると、/mnt/ramdisk-minecraft/data/を使うように設定する。
要は、「~/mc/」を機械的に「/mnt/ramdisk-minecraft/」に置き換えなければならない。
注意:
バックアップはあくまで予備であって、最新データは常に~/mcにある本体の方だということに注意。
鯖終了後に、バックアップの方は~/mc/の本体より最大で30分古いということ。
ただ、終了時にもバックアップして常に最新データを複数持っておきたいというのなら1行加えるだけで簡単にできるので言ってくれ。
以上。
CHANGELOG
2013-03-06(1):
$UIDが空になる問題。もしかして$USERを上書きするのがマズかったのか?とりあえずUSERという変数を使わないようにしてみた。
2013-03-07(1):
Ubuntuにおいて/bin/shは/bin/dashだが、これが$UIDを使えないことが判明。UID_="`id -u`"することで解決。
2013-03-07(2):
エラーメッセージを多少詳細にしないこともない。あと無害なバグ修正。
2013-03-07(3):
無害なバグ修正。
2013-03-07(4):
無害かつ重大なバグを修正。これで完璧!
#!/bin/sh
# SCRIPT_PATH won't be expanded.
# don't use environment variables or "~", etc...
SCRIPT_PATH=/home/no961/mc/minebackup.sh
USER_NORMAL=no961
CRON_FILE=/etc/cron.d/minecraft_server_backup
# echo to stderr.
eecho()
{
echo "$@" >&2
}
install()
{
# execute ${SCRIPT_PATH} as ${USER_NORMAL} every 30 minutes.
echo '*/30 * * * * '"${USER_NORMAL} ${SCRIPT_PATH}" >"${CRON_FILE}"
eecho "successfully installed."
}
uninstall()
{
# remove cron file
rm "${CRON_FILE}"
eecho "successfully uninstalled."
}
UID_="`id -u`"
case ${UID_} in
0|999)
# super user
# 999: ubuntu live cd user.
# if you never use this script on live cd, delete "|999".
if [ "x$1" = "xuninstall" ] ; then
uninstall
else
install
fi
;;
*)
# not super user
# change to super user
eecho "UID: ${UID_}"
eecho "changing to super user..."
exec sudo $0 "$@"
;;
esac
#!/bin/sh
# backup source directory
BACKUP_SRC=/mnt/ramdisk-minecraft
# backup destination directory
BACKUP_DEST=/home/no961/mcbk
# max number of backups
MAX_BACKUPS=15
# echo to stderr.
eecho()
{
echo "$@" >&2
}
# remove backups before aborting
on_exit()
{
# signals:
# 0: EXIT
# 1: HUP
# 2: INT
# 3: QUIT
# 9: KILL
# 15: TERM
eecho "aborted. remove new backup"
# ignore signals
trap '' 2 3 9 15
# remove current backup
rm -rf "${CURRENT_BACKUP}"
# reset traps for signals
trap 2 3 9 15
eecho "done."
}
# global variable
CURRENT_BACKUP=
# check if minecraft server is running.
trap on_exit 2 3 9 15
ps aux | grep '[m]inecraft_server\.jar' >/dev/null
if [ $? -a -d ${BACKUP_SRC} -o "$1" = "force" ] ; then
# minecraft server is running and ${BACKUP_SRC} is a directory.
BACKUPS="`find ${BACKUP_DEST} -maxdepth 1 -mindepth 1 -type d | sort -n`"
BACKUPS_NUMBER="`echo "${BACKUPS}" | wc -l`"
if [ ${BACKUPS_NUMBER} -ge 1 ] ; then
OLDEST_BACKUP="`echo "${BACKUPS}" | head -1`"
LATEST_BACKUP="`echo "${BACKUPS}" | tail -1`"
CURRENT_BACKUP="${BACKUP_DEST}/`date '+%Y%m%d-%H%M%S'`"
eecho "oldest backup: ${OLDEST_BACKUP}/"
eecho "latest backup: ${LATEST_BACKUP}/"
eecho "new backup: ${CURRENT_BACKUP}/"
eecho "execute backup."
# execute backup
rsync -a --delete --link-dest="${LATEST_BACKUP}/" "${BACKUP_SRC}/" "${CURRENT_BACKUP}/"
else
# first backup
CURRENT_BACKUP="${BACKUP_DEST}/`date '+%Y%m%d-%H%M%S'`"
eecho "new backup: ${CURRENT_BACKUP}/"
eecho "execute backup."
# execute backup
rsync -a --delete "${BACKUP_SRC}/" "${CURRENT_BACKUP}/"
fi
eecho "copy done."
if [ ${BACKUPS_NUMBER} -ge ${MAX_BACKUPS} ] ; then
eecho "remove oldest backup."
# remove oldest backup
rm -rf "${OLDEST_BACKUP}"
fi
fi
#!/bin/sh
# no bash, no zsh.
# mount point of ramdisk
RAMDISK=/mnt/ramdisk-minecraft
# maximum size of ramdisk is 4GiB (4294967296 bytes).
SIZE=4g
# user to execute minecraft server process
# This *should NOT be root* for security reasons.
USER_NORMAL=no961
# place of application data
DATA_HDD=/home/no961/mc
RSYNC_DONE=0
# echo to stderr.
eecho()
{
echo "$@" >&2
}
# sync data and unmount ramdisk before exiting
on_exit()
{
# signals:
# 0: EXIT
# 1: HUP
# 2: INT
# 3: QUIT
# 9: KILL
# 15: TERM
# ignore signals
trap '' 0 2 3 9 15
if [ "${RSYNC_DONE}" -eq 1 ] ; then
# sync data
eecho -n "copy data from ramdisk to HDD. please wait..."
rsync -a --delete "${RAMDISK}/" "${DATA_HDD}/"
eecho " done."
fi
eecho "unmount the ramdisk on exit."
# unmount
umount ${RAMDISK}
# and remove directory.
rmdir ${RAMDISK}
# reset traps for signals
trap 0 2 3 9 15
eecho "done."
}
main()
{
# make ramdisk
# if $RAMDISK is not a directory,
if [ ! -d ${RAMDISK} ] ; then
eecho "${RAMDISK} already exist and it is not directory."
eecho "remove and make the directory."
# remove $RAMDISK to create the directory whose name is $RAMDISK
rm -rf ${RAMDISK} 2>/dev/null
# and remake the directory.
mkdir ${RAMDISK}
if [ ! $? ] ; then
eecho "failed to create directory ${RAMDISK}."
exit 1
fi
fi
# mount
# About /dev/shm, see http://sharadchhetri.com/2012/08/15/devshm-mount-devshm/
eecho -n "mount ramdisk..."
mount -t tmpfs -o size=${SIZE} /dev/shm ${RAMDISK}
# Unmounting is needed after mounting ramdisk.
trap on_exit 0 2 3 9 15
eecho "done."
# set permission
chown -R ${USER_NORMAL} ${RAMDISK}
chmod 775 ${RAMDISK}
# This doesn't need root privilege.
# execute as ${USER_NORMAL}.
eecho -n "copying data from HDD to ramdisk. please wait..."
sudo -u ${USER_NORMAL} -i rsync -a "${DATA_HDD}/" "${RAMDISK}/"
RSYNC_DONE=1
eecho " done."
eecho "execute minecraft server as ${USER_NORMAL}."
sudo -u ${USER_NORMAL} -i sh -c "cd ${RAMDISK}; java -Xmx1024M -Xms1024M -jar ${RAMDISK}/minecraft_server.jar nogui"
}
UID_="`id -u`"
case ${UID_} in
0|999)
# super user
# 999: ubuntu live cd user.
# if you never use this script on live cd, delete "|999".
echo "this script is running as root."
main
;;
*)
# not super user
# change to super user
eecho "UID: ${UID_}"
eecho "changing to super user..."
exec sudo $0 "$@"
;;
esac
1. ramディスクの作りかた (root権限必要)
######
## $DEST: マウント先
## $SIZE: 容量(例えば512MiBなら512m)
# まず、マウント先に同名のファイルが存在してるとアレなので削除
sudo rmdir $DEST
# そしてディレクトリ作成。
# このディレクトリは本来は空だが、「マウント」という操作によって、
# ramdiskの内容がこのディレクトリの中にあるかのように振る舞わせる
sudo mkdir $DEST
# パーミッション(アクセス権限)の設定。誰にでも読み書き実行を可能にする
sudo chmod 777 /mnt/ramdisk
# マウント。ramdiskにパスを与え、内容にアクセス可能にする
sudo mount -t tmpfs -o size=$SIZE /dev/shm $DEST
# 一応、状態を表示させてみる
df
########
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment