Here’s a recipe for setting up Minecraft server on OS X. Since I don’t fully trust the server not to have some security hole, I want it to run as user nobody so it doesn’t have a lot of permissions. And I also want it to restart automatically when I reboot the computer. Finally I show how to backup the worlds you create.
There’s three parts to this hint.
1) creating the launchDaemon that starts the minecraft server.
2) how to turn it on and off
3) maintaining backups
The first step is to download the minecraft server jar file from the Mojang website. Currently that site is https://minecraft.net/download but that might change in the future. And currently the jar filename is: minecraft_server.1.6.2.jar, but that will change too.
1) Creating a place for it. When you run the jar the first time it’s going to create a lot of files and subdirectories the in the current working directory (CWD) so we want to create a nice place to do this. It doesn’t matter where this it, but the permissions on the folder do matter. I put mine in /opt
sudo -s -
mkdir -p /opt/minecraft_server/state
Now if your user name is bob then move the minecraft jar into place:
mv /User/bob/Downloads/minecraft_server.1.6.2.jar /opt/minecraft
and make sure the top level folder and executable are owned by root. This will assure that no one can change the jar file without root access. Since the system is going to invoke this file automatically you don’t want it changing with simple user level permissions.
chown -R root:wheel /opt/minecraft<em>server
chmod -R a+xr /opt/minecraft</em>server
Minecraft is going to run as user nobody, and it will need permission to modify the state folder contents.
chown nobody /opt/state
chmod 755 /opt/state
2) Creating the launch daemon:
As root, create the file
/Library/LaunchDaemons/net.minecraft.plist
The file name is not important, but it’s tradition to name the Daemon for website that it came from. You need to create this as root or otherwise assure it’s owned by root:wheel and can be read. It’s not an executable.
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>net.minecraft</string>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/opt/minecraft_server/state</string></p>
<pre><code> <key>UserName</key>
<string>nobody</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/java</string>
<string>-Xmx1024M</string>
<string>-Xms1024M</string>
<string>-jar</string>
<string>/opt/minecraft_server/minecraft_server.1.6.2.jar</string>
<string>nogui</string>
</array>
</code></pre>
<p></dict>
</plist>
The above is plist speak to tell it that it should change into the working directory where we want it to store its data, then launch the java jar with a memory size of 1G. You can adjust the values for your system if that turns out to be too much. It also tells it to run the job as the username nobody. And it will start the server when the Daemon is loaded, which happens either at boot time or if you explicitly tell the daemon to load.
The key thing here is that the paths to the “state” folder and the executable are hardcoded. You must change these paths if you set this up in a different place.
2) testing it. first make sure you have java installed. /usr/bin/java -version if java is installed then this will reply with the java version at that path. If it’s not installed OSX will usually ask you if you want to install java and then automagically do this for you.
as root, (sudo -s -) run the following: launchctl load /Library/LaunchDaemons/net.minecraft.plist
test to see if it worked:
ps auxww | grep java | grep jar
does the output include something like this:
nobody 1405 0.5 10.8 3814720 681608 ?? Rs Mon06PM 25:58.23 /usr/bin/java…
If so then the server jar is running and is running as nobody.
If not then you made a mistake. To help diagnose this try running the command right from the command line.
cd /opt/minecraft<em>server/state
/usr/bin/java -Xmx1024M -Xms1024M -jar /opt/minecraft</em>server/minecraft_server.1.6.2.jar
note, at this point you are running the server as root. This is reasonably safe, assuming you trust mojang, to do for a moment just to eliminate the permission issues. If you are nervous, disconnect your ethernet cable for a moment.
You may see some java exceptions printed in the process, but if the program stays running then it’s working. Once it stops printing stuff out, type ctrl-c to kill it. List the current directory (state) and you will see a whole bunch of files and folders have been created. So now you know the program and the paths are right. You’ll need to find the error you made. Most likely a permissions issue.
2) controlling it. to load the server by hand:
sudo launchctl load /Library/LaunchDaemons/net.minecraft.plist
it will start when you load it the first time.
to stop the server temporarily
sudo launchctl stop net.minecraft
Here I used the name not the path. The name is one given in the plist file not the actual file name. Normally you want to make these the same for sanity sake. This command stops the server but it doesn’t remove the autostart Daemon—next boot it will start again.
to restart it after stopping:
sudo launchctl start net.minecraft
to unload the daemon (so it won’t autostart at boot)
sudo launchctl unload /Library/LaunchDaemons/net.minecraft.plist
If you edit the plist file, you need to stop the server and unload the daemon then (re)load the daemon. Otherwise it will ignore your edits till next reboot.
3) backing up the state. from time to time you may want to back up the state of your minecraft world and the server configuration (banned-IP, whitelist, config…)
To do that:
sudo -s -
cd /opt/minecraft_server
find ./state | sudo cpio -dpl <code>date "+%y%m%d-%H%M-minecraft"</code>
this command will create a snapshot backup of the state of your system. This will look like a copy off the state directory tree and files. But it’s not a copy. It’s a hardlinked image. It doesn’t actually occupy any (significant) disk space unless your world is changed. The command names the new snapshot for the date and time down to the hour.
You can restore an older image to being the current state by deleting the current state folder and moving the state folder from the image folder to the minecraft working directory.
Lex adds: I haven’t tested this one.