Advertisement
Guest User

ServerStartLinux

a guest
Aug 28th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.26 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. #### Minecraft-Forge Server install/launcher script
  4. #### Linux Version
  5. ####
  6. #### Created by: Dijkstra
  7. #### Mascot: Ordinator
  8. ####
  9. #### Originally created for use in "All The Mods" modpacks
  10. #### NO OFFICIAL AFFILIATION WITH MOJANG OR FORGE
  11. ####
  12. #### This script will fetch the appropriate forge installer
  13. #### and run it to install forge AND fetch Minecraft (from Mojang)
  14. #### If Forge and Minecraft are already installed it will skip
  15. #### download/install and launch server directly (with
  16. #### auto-restart-after-crash logic as well)
  17. ####
  18. #### Make sure this is running as BASH
  19. #### You might need to chmod +x before executing
  20. ####
  21. #### IF THERE ARE ANY ISSUES
  22. #### Please make a report on the AllTheMods github:
  23. #### https://github.com/whatthedrunk/allthemods/issues
  24. #### with the contents of [serverstart.log] and [installer.log]
  25. ####
  26. #### or come find us on Discord: https://discord.gg/FdFDVWb
  27. ####
  28.  
  29.  
  30. #For Server Owners
  31.  
  32.  
  33. #
  34. #
  35. #
  36. #
  37. #
  38. #
  39. #
  40. # Internal scripty stuff from here on out
  41. # No lines intended to be edited past here
  42. #
  43. #
  44. #
  45. #
  46. #
  47. # Make sure users aren't trying to run script via sh directly (won't work)
  48.  
  49. unameOut="$(uname -s)"
  50. case "${unameOut}" in
  51. Linux*) machine=Linux;;
  52. Darwin*) machine=Mac;;
  53. CYGWIN*) machine=Cygwin;;
  54. MINGW*) machine=MinGw;;
  55. *) machine="UNKNOWN:${unameOut}"
  56. esac
  57.  
  58. if [ ! "$BASH_VERSION" ] ; then
  59. echo "Please do not use sh to run this script ($0). Use bash instead (or execute it directly)" 1>&2
  60. exit 1
  61. fi
  62.  
  63. # routine to handle Forge/server install
  64. install_server(){
  65. echo "Starting install of Forge/Minecraft server binaries"
  66. echo "DEBUG: Starting install of Forge/Minecraft server binaries" >>serverstart.log 2>&1
  67. if [ -f installer.jar ]; then
  68. echo "DEBUG: installer.jar found in current directory" >>serverstart.log 2>&1
  69. export answer="n"
  70. read -t 8 -p "Installer found. Use it (y) or download again (n)? " answer
  71. if [[ "$answer" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
  72. echo "INFO: Skipping download. Using existing installer.jar" >>serverstart.log 2>&1
  73. echo "Skipping download. Using existing installer.jar"
  74. fi
  75. else
  76. if [ "${FORGEURL}" = "DISABLE" ]; then
  77. export URL="http://files.minecraftforge.net/maven/net/minecraftforge/forge/${MCVER}-${FORGEVER}/forge-${MCVER}-${FORGEVER}-installer.jar"
  78. else
  79. export URL="${FORGEURL}"
  80. fi
  81. echo $URL
  82. which wget >> /dev/null
  83. if [ $? -eq 0 ]; then
  84. echo "DEBUG: (wget) Downloading ${URL}" >>serverstart.log 2>&1
  85. wget -O installer.jar "${URL}" >>serverstart.log 2>&1
  86. else
  87. which curl >> /dev/null
  88. if [ $? -eq 0 ]; then
  89. echo "DEBUG: (curl) Downloading ${URL}" >>serverstart.log 2>&1
  90. curl -o installer.jar "${URL}" >>serverstart.log 2>&1
  91. else
  92. echo "Neither wget or curl were found on your system. Please install one and try again"
  93. echo "ERROR: Neither wget or curl were found" >>serverstart.log 2>&1
  94. fi
  95. fi
  96. fi
  97.  
  98. if [ ! -f installer.jar ]; then
  99. echo "Forge installer did not download"
  100. echo "ERROR: Forge installer did not download" >>serverstart.log 2>&1
  101. exit 0
  102. else
  103. echo "Moving unneeded files/folders to ./DELETEME"
  104. echo "INFO: Moving unneeded files/folders to ./DELETEME" >>serverstart.log 2>&1
  105. rm -rf ./DELETEME >>serverstart.log 2>&1
  106. mv -f ./asm ./DELETEME >>serverstart.log 2>&1
  107. mv -f ./libraries ./DELETEME >>serverstart.log 2>&1
  108. mv -f ./llibrary ./DELETEME >>serverstart.log 2>&1
  109. mv -f ./minecraft_server*.jar ./DELETEME >>serverstart.log 2>&1
  110. mv -f ./forge*.jar ./DELETEME >>serverstart.log 2>&1
  111. mv -f ./OpenComputersMod*lua* ./DELETEME >>serverstart.log 2>&1
  112. echo "Installing Forge Server, please wait..."
  113. echo "INFO: Installing Forge Server" >>serverstart.log 2>&1
  114. java -jar installer.jar --installServer >>serverstart.log 2>&1
  115. echo "Deleting Forge installer (no longer needed)"
  116. echo "INFO: Deleting installer.jar" >>serverstart.log 2>&1
  117. rm -rf installer.jar >>serverstart.log 2>&1
  118. fi
  119. }
  120.  
  121. # routine to [re]start Forgemodded minecraft server
  122. start_server() {
  123. echo ""
  124. echo ""
  125. echo "Starting server"
  126. echo "INFO: Starting Server at " $(date -u +%Y-%m-%d_%H:%M:%S) >>serverstart.log 2>&1
  127. java -Xmx${MAX_RAM} ${JAVA_ARGS} -jar forge-${MCVER}-${FORGEVER}-universal.jar nogui
  128. }
  129.  
  130. # routine for basic directory checks
  131. check_dir(){
  132. echo "DEBUG: Current directory is " $(pwd) >>serverstart.log 2>&1
  133. if [ "$(pwd)" = "/tmp" ] || [ "$(pwd)" = "/var/tmp" ]; then
  134. echo "Current directory appears to be TMP"
  135. echo "WARN: Current DIR is TEMP" >>serverstart.log 2>&1
  136. if [ ${RUN_FROM_BAD_FOLDER} -eq 0 ]; then
  137. echo "ERROR: Stopping due to bad folder (TMP)" >>serverstart.log 2>&1
  138. echo "RUN_FROM_BAD_FOLDER setting is off, exiting script"
  139. exit 0
  140. else
  141. echo "WARN: Bad folder (TMP) but continuing anyway" >>serverstart.log 2>&1
  142. echo "Bypassing cd=temp halt per script settings"
  143. fi
  144. fi
  145.  
  146. if [ ! -r . ] || [ ! -w . ]; then
  147. echo "WARN: Not full R/W access on current directory"
  148. echo "You do not have full R/W access to current directory"
  149. if [ ${RUN_FROM_BAD_FOLDER} -eq 0 ]; then
  150. echo "ERROR: Stopping due to bad folder (R/W access)" >>serverstart.log 2>&1
  151. echo "RUN_FROM_BAD_FOLDER setting is off, exiting script"
  152. exit 0
  153. else
  154. echo "WARN: Bad folder (R/W) cut continuing anyway" >>serverstart.log 2>&1
  155. echo "Bypassing no R/W halt (per script settings)"
  156. fi
  157. fi
  158. }
  159.  
  160. # routine for ping inet connectivity
  161. check_connection(){
  162. if [ ${IGNORE_OFFLINE} -eq 1 ]; then
  163. echo "WARN: Internet connectivity checking is disabled" >>serverstart.log 2>&1
  164. echo "Skipping internet connectivity check"
  165. else
  166. if ping -c 1 8.8.8.8 >> /dev/null 2>&1; then
  167. echo "INFO: Ping to Google DNS successfull" >>serverstart.log 2>&1
  168. echo "Ping to Google DNS successfull"
  169. else
  170. echo "ERROR: Ping to Google DNS failed. No internet access?" >>serverstart.log 2>&1
  171. echo "Ping to Google DNS failed. No internet access?"
  172. fi
  173.  
  174. if ping -c 1 4.2.2.1 >> /dev/null 2>&1; then
  175. echo "INFO: Ping to L4 successfull" >>serverstart.log 2>&1
  176. echo "Ping to L4 successfull"
  177. else
  178. echo "ERROR: Ping to L4 failed. No internet access?" >>serverstart.log 2>&1
  179. echo "Ping to L4 failed. No internet access?"
  180. exit 0
  181. fi
  182. fi
  183. }
  184.  
  185. # routine to make sure necessary binaries are found
  186. check_binaries(){
  187. if [ ! -f ${FORGE_JAR} ] ; then
  188. echo "WARN: ${FORGE_JAR} not found" >>serverstart.log 2>&1
  189. echo "Required files not found, need to install Forge"
  190. install_server
  191. fi
  192. if [ ! -f ./minecraft_server.${MCVER}.jar ] ; then
  193. echo "WARN: minecraft_server.${MCVER}.jar not found" >>serverstart.log 2>&1
  194. echo "Required files not found, need to install Forge"
  195. install_server
  196. fi
  197. if [ ! -d ./libraries ] ; then
  198. echo "WARN: library directory not found" >>serverstart.log 2>&1
  199. echo "Required files not found, need to install Forge"
  200. install_server
  201. fi
  202. }
  203.  
  204. read_config(){
  205. while read -r line || [[ -n "$line" ]] ; do
  206. if echo $line | grep -F = &>/dev/null; then
  207. if [[ ${str:0:1} != "#" ]] ; then
  208. name=$(echo "$line" | cut -d '=' -f 1)
  209. val=$(echo "${line}" | cut -d '=' -f 2-)
  210. eval "export ${name}='${val%?}'"
  211. fi
  212. fi
  213. done < settings.cfg
  214.  
  215. }
  216.  
  217. eula(){
  218. if [ ! -f eula.txt ]; then
  219. echo "Could not find eula.txt starting server to generate it"
  220. start_server
  221. echo ""
  222. echo "Closing to give user a change to accept the eula"
  223. exit 0
  224. else
  225. if grep -Fxq "eula=false" eula.txt; then
  226. echo "Could not find 'eula=true' in 'eula.txt'"
  227. echo "Closing to give user a change to accept the eula"
  228. exit 0
  229. fi
  230. fi
  231. }
  232.  
  233. read_config
  234.  
  235. # Script/batch starts here...
  236.  
  237. # init log file and dump basic info
  238. echo "INFO: Starting script at" $(date -u +%Y-%m-%d_%H:%M:%S) >serverstart.log 2>&1
  239. echo "DEBUG: Dumping starting variables: " >>serverstart.log 2>&1
  240. echo "DEBUG: MAX_RAM=$MAX_RAM" >>serverstart.log 2>&1
  241. echo "DEBUG: JAVA_ARGS=$JAVA_ARGS" >>serverstart.log 2>&1
  242. echo "DEBUG: CRASH_COUNT=$CRASH_COUNT" >>serverstart.log 2>&1
  243. echo "DEBUG: RUN_FROM_BAD_FOLDER=$RUN_FROM_BAD_FOLDER" >>serverstart.log 2>&1
  244. echo "DEBUG: IGNORE_OFFLINE=$IGNORE_OFFLINE" >>serverstart.log 2>&1
  245. echo "DEBUG: MCVER=$MCVER" >>serverstart.log 2>&1
  246. echo "DEBUG: FORGEVER=$FORGEVER" >>serverstart.log 2>&1
  247. echo "DEBUG: FORGEURL=$FORGEURL" >>serverstart.log 2>&1
  248. echo "DEBUG: Basic System Info: " $(uname -a) >>serverstart.log 2>&1
  249. if [ "$machine" = "Mac" ]
  250. then
  251. echo "DEBUG: Total RAM estimate: " $(sysctl hw.memsize | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024 / 1024" MB"}') >>serverstart.log 2>&1
  252. else
  253. echo "DEBUG: Total RAM estimate: " $(getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024 / 1024" MB"}') >>serverstart.log 2>&1
  254. fi
  255. echo "DEBUG: Java Version info: " $(java -version) >>serverstart.log 2>&1
  256. echo "DEBUG: Dumping current directory listing " >>serverstart.log 2>&1
  257. ls -s1h >>serverstart.log 2>&1
  258.  
  259. export answer="n"
  260. echo ""
  261. read -t 6 -p "About to start server. Force re-install (y/n)? " answer
  262. if [[ "$answer" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
  263. echo "INFO: User chose to manually re-install server files" >>serverstart.log 2>&1
  264. echo "User chose to manually re-install server files"
  265. install_server
  266. fi
  267.  
  268. check_dir
  269. check_connection
  270. check_binaries
  271. eula
  272.  
  273. # loop to restart server and check crash frequency
  274. a=0
  275. last_crash=$((SECONDS))
  276. while true ; do
  277. start_server
  278. b=$?
  279. if [ "$b" -eq "0" ]; then
  280. a=0
  281. else
  282. now=$((SECONDS))
  283. diff=$(($now-$last_crash))
  284. if [ "$diff" -gt "3600" ]; then
  285. a=1
  286. else
  287. a=$((a+1))
  288. fi
  289. last_crash=$((SECONDS))
  290. fi
  291. if [ "$a" -eq ${CRASH_COUNT} ]; then
  292. echo "The server has crashed to many times"
  293. echo "ERROR: Server has failed too start too many times in a row." >>serverstart.log 2>&1
  294. exit 0
  295. fi
  296.  
  297. export answer="y"
  298. echo "Server will restart in ~10 seconds. No input needed..."
  299. read -t 12 -p "Restart now (y) or exit to shell (n)? " answer
  300. if [[ "$answer" =~ ^([nN][oO]|[nN])+$ ]]; then
  301. echo "INFO: User cancelled restart; exiting to shell" >>serverstart.log 2>&1
  302. exit 0
  303. fi
  304.  
  305. #re-validate stuff each server restart
  306. check_dir
  307. check_connection
  308. check_binaries
  309. eula
  310. echo "INFO: Server-auto-restart commencing" >>serverstart.log 2>&1
  311. echo "Rebooting now!"
  312. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement