Last active
December 14, 2015 12:59
-
-
Save lo48576/5090199 to your computer and use it in GitHub Desktop.
utilities for @No_961
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ファイル置いてく。あと解説 | |
| 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): | |
| 無害かつ重大なバグを修正。これで完璧! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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