Advertisement
mikebald

MC Start Script

Mar 24th, 2015
365
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.75 KB | None | 0 0
  1. #!/bin/bash
  2. # /etc/init.d/minecraft
  3. # version 0.3.2 2011-01-27 (YYYY-MM-DD)
  4. ### BEGIN INIT INFO
  5. # Provides: minecraft
  6. # Required-Start: $local_fs $remote_fs
  7. # Required-Stop: $local_fs $remote_fs
  8. # Should-Start: $network
  9. # Should-Stop: $network
  10. # Default-Start: 2 3 4 5
  11. # Default-Stop: 0 1 6
  12. # Short-Description: Minecraft server
  13. # Description: Starts the minecraft server
  14. ### END INIT INFO
  15. # Settings start
  16. USERNAME="<username>"
  17. JMXPORT=<jmx port>
  18. SERVICE='forge_latest.zip'
  19. MCPATH="/home/$USERNAME/minecraft"
  20. BACKUPPATH="/home/$USERNAME/backup"
  21. CHECKSERVER="/home/$USERNAME/CheckServer"
  22. JMXPWFILE="<path to jmx password file>"
  23. CRASHLOG_DB_PATH='<path to dump crash logs>'
  24. JAVA_HOME="/usr/local/lib/jrockit"
  25. MEMORY_OPTS="-Xmx8G -Xms8G"
  26. JAVA_OPTIONS="-XX:FlightRecorderOptions=defaultrecording=true,disk=true,repository=/home/$USERNAME/jfr/,maxage=30m,settings=profile"
  27. JMX_OPTIONS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=$JMXPORT -Dcom.sun.management.jmxremote.password.file=$JMXPWFILE"
  28. INVOCATION="${JAVA_HOME}/bin/java ${MEMORY_OPTS} ${JAVA_OPTIONS} ${JMX_OPTIONS} -jar $SERVICE nogui"
  29. BACKUPARCHIVEPATH=$BACKUPPATH/archive
  30. BACKUPDIR=$(date +%b_%Y)
  31. PORT=$(grep server-port $MCPATH/server.properties | cut -d '=' -f 2)
  32. if [ -z "$PORT" ]; then
  33. PORT=25565
  34. fi
  35. # Settings end
  36. if [ $(whoami) != $USERNAME ]; then
  37. su $USERNAME -l -c "$(readlink -f $0) $*"
  38. exit $?
  39. fi
  40. is_running() {
  41. if [ ! -e $MCPATH/java.pid ]; then
  42. return 1
  43. fi
  44. pid=$(cat $MCPATH/java.pid)
  45. if [ -z $pid ]; then
  46. return 1
  47. fi
  48. ps -eo "%p" | grep "^\\s*$pid\\s*\$" > /dev/null
  49. return $?
  50. }
  51. mc_start() {
  52. if is_running; then
  53. echo "Tried to start but $SERVICE was already running!"
  54. else
  55. echo "$SERVICE was not running... starting."
  56. cd $MCPATH
  57. screen -dmS mc$PORT $INVOCATION &
  58. for (( i=0; i < 10; i++ )); do
  59. screenpid=$(ps -eo '%p %a' | grep -v grep | grep -i screen | grep mc$PORT | awk '{print $1}')
  60. javapid=$(ps -eo '%P %p' | grep "^\\s*$screenpid " | awk '{print $2}')
  61. if [[ -n "$screenpid" && -n "$javapid" ]]; then
  62. break
  63. fi
  64. sleep 1
  65. done
  66. if [[ -n "$screenpid" && -n "$javapid" ]]; then
  67. echo "$SERVICE is now running."
  68. echo "$javapid" > $MCPATH/java.pid
  69. echo "$screenpid.mc$PORT" > $MCPATH/screen.name
  70. else
  71. echo "Could not start $SERVICE."
  72. fi
  73. fi
  74. }
  75. mc_startmonitor() {
  76. if [ -z $CHECKSERVER ]; then
  77. echo "started monitor"
  78. /usr/bin/daemon --name=minecraft_checkserver -- $JAVA_HOME/bin/java -cp $CHECKSERVER CheckServer localhost $PORT
  79. fi
  80. }
  81. mc_saveoff() {
  82. if is_running; then
  83. echo "$SERVICE is running... suspending saves"
  84. mc_exec "say SERVER BACKUP STARTING. Server going readonly..."
  85. mc_exec "save-off"
  86. mc_exec "save-all"
  87. sync
  88. sleep 10
  89. else
  90. echo "$SERVICE was not running. Not suspending saves."
  91. fi
  92. }
  93. mc_saveon() {
  94. if is_running; then
  95. echo "$SERVICE is running... re-enabling saves"
  96. mc_exec "save-on"
  97. mc_exec "say SERVER BACKUP ENDED. Server going read-write..."
  98. else
  99. echo "$SERVICE was not running. Not resuming saves."
  100. fi
  101. }
  102. mc_kill() {
  103. pid=$(cat $MCPATH/java.pid)
  104. echo "terminating process with pid $pid"
  105. kill $pid
  106. for (( i=0; i < 10; i++ )); do
  107. is_running || break
  108. sleep 1
  109. done
  110. if is_running; then
  111. echo "$SERVICE could not be terminated, killing..."
  112. kill -SIGKILL $pid
  113. echo "$SERVICE killed"
  114. else
  115. echo "$SERVICE terminated"
  116. fi
  117. }
  118. mc_stop() {
  119. if is_running; then
  120. echo "$SERVICE is running... stopping."
  121. mc_exec "say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map..."
  122. mc_exec "save-all"
  123. sleep 10
  124. mc_exec "stop"
  125. for (( i=0; i < 20; i++ )); do
  126. is_running || break
  127. sleep 1
  128. done
  129. else
  130. echo "$SERVICE was not running."
  131. fi
  132. if is_running; then
  133. echo "$SERVICE could not be shut down cleanly... still running."
  134. mc_kill
  135. else
  136. echo "$SERVICE is shut down."
  137. fi
  138. rm $MCPATH/java.pid
  139. rm $MCPATH/screen.name
  140. }
  141. mc_stopmonitor() {
  142. if [ -z $CHECKSERVER ]; then
  143. /usr/bin/daemon --name=minecraft_checkserver --stop
  144. fi
  145. }
  146. mc_backup() {
  147. echo "Backing up minecraft world"
  148. [ -d "$BACKUPPATH/$BACKUPDIR" ] || mkdir -p "$BACKUPPATH/$BACKUPDIR"
  149. rdiff-backup $MCPATH "$BACKUPPATH/$BACKUPDIR"
  150. echo "Backup complete"
  151. }
  152. mc_thinoutbackup() {
  153. if (($(date +%H) == 0)) && (($(date +%M) < 15)); then
  154. archivedate=$(date --date="7 days ago")
  155. echo "Thinning backups created $archivedate out"
  156. archivedateunix=$(date --date="$archivedate" +%s)
  157. archivesourcedir=$BACKUPPATH/$(date --date="$archivedate" +%b_%Y)
  158. archivesource=$archivesourcedir/rdiff-backup-data/increments.$(date --date="$archivedate" +%Y-%m-%dT%H):0*.dir
  159. archivesource=$(echo $archivesource)
  160. archivedest=$BACKUPARCHIVEPATH/$(date --date="$archivedate" +%b_%Y)
  161. if [[ ! -f $archivesource ]]; then
  162. echo "Nothing to be done"
  163. else
  164. tempdir=$(mktemp -d)
  165. if [[ ! $tempdir =~ ^/tmp ]]; then
  166. echo "invalid tmp dir $tempdir"
  167. else
  168. rdiff-backup $archivesource $tempdir
  169. rdiff-backup --current-time $archivedateunix $tempdir $archivedest
  170. rm -R "$tempdir"
  171. rdiff-backup --remove-older-than 7D --force $archivesourcedir
  172. echo "done"
  173. fi
  174. fi
  175. fi
  176. }
  177. mc_exec() {
  178. if is_running; then
  179. screen -p 0 -S $(cat $MCPATH/screen.name) -X stuff "$@$(printf \\r)"
  180. else
  181. echo "$SERVICE was not running. Not executing command."
  182. fi
  183. }
  184. mc_dumpcrashlogs() {
  185. if is_running; then
  186. cp $MCPATH/crash-reports/* $CRASHLOG_DB_PATH
  187. mv $MCPATH/crash-reports/* $MCPATH/crash-reports.archive/
  188. fi
  189. }
  190. #Start-Stop here
  191. case "$1" in
  192. start)
  193. if mc_start
  194. then
  195. mc_startmonitor
  196. fi
  197. ;;
  198. stop)
  199. mc_stopmonitor
  200. mc_stop
  201. ;;
  202. restart)
  203. mc_stop
  204. mc_start
  205. ;;
  206. backup)
  207. mc_saveoff
  208. mc_backup
  209. mc_saveon
  210. mc_thinoutbackup
  211. ;;
  212. exec)
  213. shift
  214. mc_exec "$@"
  215. ;;
  216. dumpcrashlogs)
  217. mc_dumpcrashlogs
  218. ;;
  219. status)
  220. if is_running
  221. then
  222. echo "$SERVICE is running."
  223. else
  224. echo "$SERVICE is not running."
  225. fi
  226. ;;
  227. *)
  228. echo "Usage: $(readlink -f $0) {start|stop|restart|backup|exec|dumpcrashlogs|status}"
  229. exit 1
  230. ;;
  231. esac
  232. exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement