2

I have a Raspberry Pi model 2. I have a start.sh file in my MinecraftServer folder in the directory /home/pi/MinecraftServer it starts the Java server which is required to play Minecraft. I want this to run at boot. I have tried using the crontab -e command and placed this in it @reboot sh /home/pi/MinecraftServer/start.sh doesn't work.

I tried to put it in rc.local but that does not do the trick. Any suggestions? I even tried running it with screen in the /etc/init.d directory, but that doens't work either. I can start it manually, but I want it to start at boot.

  • 2
    If you put it in rc.local, you probably have to use & at the end to fork it, unless it does that already. You could also try /path/to/start.sh &> /tmp/start.sh.log & (the &> redirects output) to see if this provides any clues about why it isn't working. – goldilocks Mar 6 '15 at 14:40
  • Will try it now! – jrust Mar 6 '15 at 15:15
  • @goldilocks ain't getting any output. I did the & but forgot to write it down. – jrust Mar 6 '15 at 15:22
  • Is start.sh that long? Paste it in. – goldilocks Mar 6 '15 at 15:30
  • <code>java -Xmx1024M -Xms512M -jar minecraft_server.1.8.1.jar nogui</code> this is all the code there is, it starts the minecraft server. Both scripts are in the same directory – jrust Mar 6 '15 at 16:10
3

It might be an evironment issue.

java -Xmx1024M -Xms512M -jar minecraft_server.1.8.1.jar nogui

That isn't telling it where minecraft_server.1.8.1.jar is located so it needs to be executed from the same directory. I would try adding the full path to the jar file in your start.sh like this:

java -Xmx1024M -Xms512M -jar /home/pi/MinecraftServer/minecraft_server.1.8.1.jar nogui

or I would change your cron to run out of the same directory as start.sh like this:

@reboot sh cd /home/pi/MinecraftServer;./start.sh
2

What you really want, probably, is to create a minecraft service in init.d . I found one at gamepedia that I have modified slightly into this (still needs work, though):

#!/bin/bash
# /etc/init.d/minecraft
# version 0.3.9 2012-08-13 (YYYY-MM-DD)

### BEGIN INIT INFO
# Provides:   minecraft
# Required-Start: $local_fs $remote_fs
# Required-Stop:  $local_fs $remote_fs
# Should-Start:   $network
# Should-Stop:    $network
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Short-Description:    Minecraft server
# Description:    Starts the minecraft server
### END INIT INFO

#Settings
SERVICE='minecraft_server.jar'
OPTIONS='nogui'
USERNAME='minecraft'
WORLD='world'
MCPATH='/home/minecraft'
MCLOG='logs/latest.log'
BACKUPPATH='/home/minecraft/backup'
MAXHEAP=2048
MINHEAP=512
HISTORY=1024
CPU_COUNT=1
INVOCATION="java -Xmx${MAXHEAP}M -Xms${MINHEAP}M -XX:+UseConcMarkSweepGC \
-XX:+CMSIncrementalPacing -XX:+AggressiveOpts -jar $SERVICE $OPTIONS"

ME=`whoami`
as_user() {
  #sudo -u minecraft $1
  if [ $ME == $USERNAME ] ; then
    bash -c "$1"
  else
    su -s /bin/bash $USERNAME -c "$1"
  fi
}

mc_start() {
  if  pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is already running!"
  else
    echo "Starting $SERVICE..."
    cd $MCPATH
    echo "In $MCPATH"
    as_user "screen -h $HISTORY -dmS minecraft $INVOCATION"
    sleep 7
    if pgrep -u $USERNAME -f $SERVICE > /dev/null
    then
      echo "$SERVICE is now running."
    else
      echo "Error! Could not start $SERVICE!"
    fi
  fi
}

mc_saveoff() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is running... suspending saves"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER BACKUP STARTING. Server going readonly...\"\015'"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-off\"\015'"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'"
    sync
    sleep 10
  else
    echo "$SERVICE is not running. Not suspending saves."
  fi
}

mc_saveon() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is running... re-enabling saves"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-on\"\015'"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER BACKUP ENDED. Server going read-write...\"\015'"
  else
    echo "$SERVICE is not running. Not resuming saves."
  fi
}

mc_stop() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "Stopping $SERVICE"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"say SERVER SHUTTING DOWN IN 10 SECONDS. Saving map...\"\015'"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"save-all\"\015'"
    sleep 10
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"stop\"\015'"
    sleep 7
  else
    echo "$SERVICE was not running."
  fi
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "Error! $SERVICE could not be stopped."
  else
    echo "$SERVICE is stopped."
  fi
}

mc_update() {
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    echo "$SERVICE is running! Will not start update."
  else
    MC_SERVER_URL=http://s3.amazonaws.com/MinecraftDownload/launcher/minecraft_server.jar?v=`date | sed "s/[^a-zA-Z0-9]/_/g"`
    as_user "cd $MCPATH && wget -q -O $MCPATH/minecraft_server.jar.update $MC_SERVER_URL"
    if [ -f $MCPATH/minecraft_server.jar.update ]
    then
      if `diff $MCPATH/$SERVICE $MCPATH/minecraft_server.jar.update >/dev/null`
      then 
        echo "You are already running the latest version of $SERVICE."
      else
        as_user "mv $MCPATH/minecraft_server.jar.update $MCPATH/$SERVICE"
        echo "Minecraft successfully updated."
      fi
    else
      echo "Minecraft update could not be downloaded."
    fi
  fi
}

mc_backup() {
   mc_saveoff

   NOW=`date "+%Y-%m-%d_%Hh%M"`
   BACKUP_FILE="$BACKUPPATH/${WORLD}_${NOW}.tar"
   echo "Backing up minecraft world..."
   #as_user "cd $MCPATH && cp -r $WORLD $BACKUPPATH/${WORLD}_`date "+%Y.%m.%d_%H.%M"`"
   as_user "tar -C \"$MCPATH\" -cf \"$BACKUP_FILE\" $WORLD"

   echo "Backing up $SERVICE"
   as_user "tar -C \"$MCPATH\" -rf \"$BACKUP_FILE\" $SERVICE"
   #as_user "cp \"$MCPATH/$SERVICE\" \"$BACKUPPATH/minecraft_server_${NOW}.jar\""

   mc_saveon

   echo "Compressing backup..."
   as_user "gzip -f \"$BACKUP_FILE\""
   echo "Done."
}

mc_command() {
  command="$1";
  if pgrep -u $USERNAME -f $SERVICE > /dev/null
  then
    pre_log_len=`wc -l "$MCPATH/$MCLOG" | awk '{print $1}'`
    echo "$SERVICE is running... executing command"
    as_user "screen -p 0 -S minecraft -X eval 'stuff \"$command\"\015'"
    sleep 1 # assumes that the command will run and print to the log file in less than .1 seconds
    # print output
    tail -n $[`wc -l "$MCPATH/$MCLOG" | awk '{print $1}'`-$pre_log_len] "$MCPATH/$MCLOG"
  fi
}

mc_log() {
  cat $MCPATH/$MCLOG
}


#Start-Stop here
case "$1" in
  start)
    mc_start
    ;;
  stop)
    mc_stop
    ;;
  restart)
    mc_stop
    mc_start
    ;;
  update)
    mc_stop
    mc_backup
    mc_update
    mc_start
    ;;
  backup)
    mc_backup
    ;;
  status)
    if pgrep -u $USERNAME -f $SERVICE > /dev/null
    then
      echo "$SERVICE is running."
    else
      echo "$SERVICE is not running."
    fi
    ;;
  command)
    if [ $# -gt 1 ]; then
      shift
      mc_command "$*"
    else
      echo "Must specify server command (try 'help'?)"
    fi
    ;;
  log)
    mc_log
    ;;

  *)
  echo "Usage: $0 {start|stop|update|backup|status|restart|log|command \"server command\"}"
  exit 1
  ;;
esac

exit 0

Once this script is placed in /etc/init.d it will start the minecraft server automatically when the system is ready, and shut the server down when the system goes down. You can interact with the server by running

service minecraft {start|stop|update|backup|status|restart|log|command "server command"}

Please do note, however, that you will probably need to configure the minecraft server to hold a limited world and turn down the visibility range slightly to allow the pi to keep up.

1

@goldilocks solved it! I'll explain it, because the script I used was for starting the server in the same directory it did not work(The script and the server where in the same directory). But as he explained said, placing cd /path/to/minecraft/directory on top of the script solved the problem. I just put the path to the script in the rc.local and it runs now! What @bex said is also a good option! I'll use that one on my other Pi! Thank you!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.