├── status ├── .gitignore ├── check.sh ├── update_paper.sh ├── stop.sh ├── backup.sh └── start.sh /status: -------------------------------------------------------------------------------- 1 | stopped 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.xml 3 | *.iml 4 | status -------------------------------------------------------------------------------- /check.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # this script checks wether the server is running. If it is not but it is supposed to, 4 | # it will be started 5 | 6 | server_status=$(cat status) 7 | 8 | if [ "$server_status" = "stopped" ] 9 | then 10 | echo "Server is supposed to be stopped. Exiting.." 11 | exit 0 12 | else 13 | echo "Checking for running server.." 14 | check_screen=$(screen -ls | grep "$screen_name") 15 | echo "..done" 16 | 17 | if [ "$check_screen" != "" ] 18 | then 19 | echo "Server is already running at '$check_screen'! Exiting.." 20 | exit 0 21 | else 22 | echo "No running server found and should be running, starting.." 23 | /bin/bash start.sh 24 | fi 25 | fi 26 | -------------------------------------------------------------------------------- /update_paper.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This script looks for the newest papermc build of a given version in the v2 api 4 | # and replaces paper.jar with it 5 | 6 | minecraft_version="1.18" 7 | 8 | echo "Looking for builds for minecraft version $minecraft_version.." 9 | newest_paper_build="$(curl -s https://papermc.io/api/v2/projects/paper/versions/$minecraft_version/ | jq '.builds[-1]')" 10 | if [ "$newest_paper_build" = "" ]; then 11 | echo "No paper builds found for minecraft version $minecraft_version, exiting.." 12 | exit 1 13 | else 14 | echo "Found newest build $newest_paper_build" 15 | 16 | # back up old paper version 17 | mv -v paper.jar paper-old.jar 18 | # download new paper build to paper.jar 19 | echo "Downloading build.." 20 | wget -O paper.jar "https://papermc.io/api/v2/projects/paper/versions/$minecraft_version/builds/$newest_paper_build/downloads/paper-$minecraft_version-$newest_paper_build.jar" 21 | echo "Done" 22 | fi -------------------------------------------------------------------------------- /stop.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # -------- required inputs -------- 4 | 5 | # name of server screen, has to be the same in start.sh 6 | screen_name=MinecraftServer 7 | 8 | # Parameter 0 gives the shutdown reaseon: 9 | # i.e.["./stop.sh " for a backup"] will result in the output: 10 | # "The server will shut down in XXs for a backup! 11 | 12 | # ############################################### 13 | 14 | # ############################################### 15 | 16 | 17 | # check for running server 18 | echo "Checking for running server.." 19 | check_screen=$(screen -ls | grep "$screen_name") 20 | 21 | echo "stopped" > status 22 | 23 | if [ "$check_screen" == "" ] 24 | then 25 | echo "No running server found! Exiting.." 26 | exit 1 27 | else 28 | echo "Server found at '$check_screen'." 29 | 30 | # send message to online players 31 | echo "Notifying players.." 32 | screen -drx "$screen_name" -X stuff "$(printf "say The server will shut down in 30s%s!\r" "$1")" 33 | echo "Message 1 sent" 34 | sleep 15s 35 | screen -drx "$screen_name" -X stuff "$(printf "say The server will shut down in 15s%s!\r" "$1")" 36 | echo "Message 2 sent" 37 | sleep 5s 38 | screen -drx "$screen_name" -X stuff "$(printf "say The server will shut down in 10s%s!\r" "$1")" 39 | echo "Message 3 sent" 40 | sleep 5s 41 | screen -drx "$screen_name" -X stuff "$(printf "say The server will shut down in 5s%s!\r" "$1")" 42 | echo "Message 4 sent" 43 | sleep 2s 44 | screen -drx "$screen_name" -X stuff "$(printf "say The server will shut down in 3s%s!\r" "$1")" 45 | echo "Message 5 sent" 46 | sleep 1s 47 | screen -drx "$screen_name" -X stuff "$(printf "say The server will shut down in 2s%s!\r" "$1")" 48 | echo "Message 6 sent" 49 | sleep 1s 50 | screen -drx "$screen_name" -X stuff "$(printf "say The server will shut down in 1s%s!\r" "$1")" 51 | echo "Message 7 sent" 52 | sleep 1s 53 | echo "..done" 54 | 55 | echo "Shutting down server.." 56 | screen -drx $screen_name -X stuff "$(printf "stop\r")" 57 | 58 | 59 | echo "..done, testing in 60s" 60 | sleep 60s 61 | 62 | # checking if server did not stop 63 | echo "Checking for running server.." 64 | check_screen=$(screen -ls | grep "$screen_name") 65 | if [ "$check_screen" != "" ] 66 | then 67 | echo "Server could not be stopped." 68 | exit 2 69 | else 70 | echo "Server stopped successfully." 71 | exit 0 72 | fi 73 | fi 74 | 75 | # ############################################### 76 | 77 | # ############################################### 78 | 79 | 80 | # -------- exit codes -------- 81 | # 82 | # --- code 0 --- 83 | # Server stopped successfully. 84 | # 85 | # --- code 1 --- 86 | # No running server was found 87 | # 88 | # --- code 2 --- 89 | # An error occoured while stopping the server. 90 | -------------------------------------------------------------------------------- /backup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # -------- required inputs -------- 4 | 5 | # name of server screen, has to be the same in both start.sh and stop.sh 6 | screen_name=MinecraftServer 7 | # directory of the minecraft server and this file 8 | out_dir=backups 9 | # specify world name to backup, for more backup files add them below at XX 10 | world_name="world" 11 | 12 | # Specify if used server software is paper, newest build will be downloaded automatically 13 | use_paper=n 14 | 15 | # Specify if latest file should be created 16 | create_latest_file=n 17 | 18 | # run script with nostop parameter to avoid server stop 19 | 20 | # ############################################### 21 | 22 | # ############################################### 23 | 24 | # directory for the backups, path does not have to exist 25 | dir=../ 26 | # enter the working directory 27 | cd "$dir" || exit 1 28 | dir=$(pwd) 29 | 30 | 31 | # send save-all to server 32 | echo "Send save-all to server.." 33 | screen -drx "$screen_name" -X stuff "$(printf "save-all\r")" 34 | sleep 15s 35 | echo "..done" 36 | 37 | if [ "$1" != "nostop" ] 38 | then 39 | # attempt server stop, if fail, exit script 40 | echo "Attempting server stop.." 41 | /bin/bash stop.sh " for a backup" || exit 2 42 | echo "..done" 43 | fi 44 | 45 | # saving date and time 46 | echo "Requesting current date and time.." 47 | date_var=$(date +"%Y-%m-%d_%H-%M") 48 | echo "$date_var" 49 | echo "..done" 50 | 51 | # creating new folder for backup 52 | echo "Preparing backup location.." 53 | mkdir -p "$out_dir"/"$date_var" 54 | echo "..done" 55 | 56 | # copy files, standard is just the world, for more files add them here witht the same syntax 57 | echo "Copying files.." 58 | cp -r "$world_name" "$out_dir"/"$date_var"/ || exit 3 59 | #cp -r world_the_end "$out_dir"/"$date_var"/ || exit 3 60 | #cp -r world_nether "$out_dir"/"$date_var"/ || exit 3 61 | #cp -r plugins/CoreProtect/database.db "$out_dir"/"$date_var"/ || exit 3 62 | 63 | echo "..done" 64 | 65 | # enter out_dir 66 | cd "$out_dir" || exit 1 67 | out_dir=$(pwd) 68 | 69 | # compress backup 70 | echo "Compressing backup.." 71 | tar cfzv "${date_var}".tar.gz "$date_var" || exit 3 72 | echo "..done" 73 | 74 | # remove folder 75 | echo "Cleaning up.." 76 | rm -rf "$date_var" 77 | echo "..done" 78 | 79 | # copy to latest 80 | if [ "$create_latest_file" != "n" ] 81 | then 82 | echo "Creating latest file.." 83 | rm "latest.tar.gz" || echo "Latest file did not exist." 84 | cp "${date_var}".tar.gz "latest.tar.gz" || exit 3 85 | echo "..done" 86 | fi 87 | 88 | cd "$dir" || exit 1 89 | 90 | if [ "$1" != "nostop" ] 91 | then 92 | if [ "$use_paper" = y ]; then 93 | echo "Updating paper.." 94 | /bin/bash update_paper.sh 95 | echo "..done" 96 | fi 97 | 98 | echo "Starting server.." 99 | /bin/bash start.sh || exit 4 100 | echo "..done" 101 | fi 102 | 103 | exit 0 104 | 105 | # ############################################### 106 | 107 | # ############################################### 108 | 109 | 110 | # -------- exit codes -------- 111 | # 112 | # --- code 0 --- 113 | # Backup created successfully. 114 | # 115 | # --- code 1 --- 116 | # Could not enter one of the directories, probably insufficient permissions. 117 | # 118 | # --- code 2 --- 119 | # Error stopping server. 120 | # 121 | # --- code 3 --- 122 | # Could not copy or compress backup, probably insufficient disk space. 123 | # 124 | # --- code 4 --- 125 | # Could not start server. 126 | -------------------------------------------------------------------------------- /start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # -------- required inputs -------- 4 | 5 | # name of server screen, has to be the same in stop.sh and backup.sh 6 | screen_name=MinecraftServer 7 | # executable jar file that starts the server 8 | jar_name=fabric-server-launch.jar 9 | #jar_name=paper.jar 10 | # max. RAM in MB dedicated to the server, recommended is 1000-1500M less than your physical memory 11 | ram_m=4000 12 | # specify if you want to use aikar flags 13 | aikar_flags=n 14 | 15 | 16 | # ############################################### 17 | 18 | # ############################################### 19 | 20 | 21 | echo "running" > status 22 | 23 | # directory where this file is located (has to be the same as the server) 24 | dir=../ 25 | # enter the working directory 26 | cd "$dir" || exit 1 27 | 28 | # check for running server 29 | echo "Checking for running server.." 30 | check_screen=$(screen -ls | grep "$screen_name") 31 | echo "..done" 32 | 33 | if [ "$check_screen" != "" ] 34 | then 35 | echo "Server is already running at '$check_screen'! Exiting.." 36 | exit 2 37 | else 38 | echo "No running server found, starting.." 39 | 40 | if [ $aikar_flags == "n" ] 41 | then 42 | echo "Running without Aikar flags" 43 | screen -AmdS "$screen_name" java -Xms${ram_m}M -Xmx${ram_m}M -jar $jar_name nogui 44 | else 45 | if [ $ram_m -lt 12000 ] 46 | then 47 | echo "Xmx is less than 12G, running default Aikar flags" 48 | screen -AmdS "$screen_name" java -Xms${ram_m}M -Xmx${ram_m}M -XX:+UseG1GC -XX:+ParallelRefProcEnabled \ 49 | -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch \ 50 | -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 \ 51 | -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 \ 52 | -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 \ 53 | -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs \ 54 | -Daikars.new.flags=true -jar $jar_name nogui 55 | else 56 | echo "Xmx is greater than 12G, running modified Aikar flags" 57 | screen -AmdS "$screen_name" java -Xms${ram_m}M -Xmx${ram_m}M -XX:+UseG1GC -XX:+ParallelRefProcEnabled \ 58 | -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch \ 59 | -XX:G1NewSizePercent=40 -XX:G1MaxNewSizePercent=50 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=15 \ 60 | -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=20 \ 61 | -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 \ 62 | -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs \ 63 | -Daikars.new.flags=true -jar $jar_name nogui 64 | fi 65 | fi 66 | 67 | # check if screen is running after 1s 68 | sleep 1s 69 | check_screen=$(screen -ls | grep $screen_name) 70 | if [ "$check_screen" != "" ] 71 | then 72 | echo "Server started successfully!" 73 | exit 0 74 | else 75 | echo "Server could not be started." 76 | exit 3 77 | fi 78 | fi 79 | 80 | # ############################################### 81 | 82 | # ############################################### 83 | 84 | 85 | # -------- exit codes -------- 86 | # 87 | # --- code 0 --- 88 | # No server was running and server was started. 89 | # 90 | # --- code 1 --- 91 | # Working directory could not be accessed. 92 | # 93 | # --- code 2 --- 94 | # Server was already running. 95 | # 96 | # --- code 3 --- 97 | # Server was not running but could not be started. 98 | --------------------------------------------------------------------------------