| Subcribe via RSS or via Email

How to run terracotta as a service

July 11th, 2008 Posted in Java

I’ve blogged about terracotta before and if you want to find out more about it I suggest you start on their website.

One thing that terracotta doesn’t provide out of the box is a way of running as a background service. While it is pretty easy to run the command in the background with a combination of & and nohup on linux e.g.:

~> nohup start-terracotta-command.sh &

However this doesn’t provide all of the functionally that you might want, like automatic restarts or remote management with JMX. It also doesn’t work on windows (if you care about that).

Luckily it is pretty simple to integrate terracotta with the java service wrapper which is an open source library to run any java program as a service. These are the steps I used to get it working:

  1. Create an environment variable that points to your terracotta install directory, I use $TERRACOTTA_HOME.
  2. Extract the correct version of the service wrapper for your platform inside $TERRACOTTA_HOME, my version was wrapper-linux-x86-32-3.3.0.
  3. Edit your $TERRACOTTA_HOME/wrapper-linux-x86-32-3.3.0/conf/wrapper.conf so it looks something like this:
    wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
    
    wrapper.java.classpath.1=../lib/wrapper.jar
    wrapper.java.classpath.2=../../lib/tc.jar
    
    wrapper.java.library.path.1=../lib
    
    wrapper.java.additional.1=-server
    wrapper.java.additional.2=-Dcom.sun.management.jmxremote
    wrapper.java.additional.3=-Dtc.install-root=../../
    
    wrapper.java.initmemory=256
    
    wrapper.java.maxmemory=256
    
    wrapper.app.parameter.1=com.tc.server.TCServerMain
    wrapper.app.parameter.2=-f ../../tc-config.xml
    
    wrapper.logfile=../logs/terracotta.log
    

    Of course you can customise most of these options fit your requirements (for example memory options or log file) or add additional parameters. Also in the conf file there are other options which you may want to look at such as logging level.

  4. Edit your $TERRACOTTA_HOME/wrapper-linux-x86-32-3.3.0/bin/testwrapper so it looks something like this:
    APP_NAME="Terracotta 2.6.2"
    APP_LONG_NAME="Terracotta 2.6.2"
     
    WRAPPER_CMD="$TERRACOTTA_HOME/wrapper-linux-x86-32-3.3.0/bin/wrapper"
    WRAPPER_CONF="$TERRACOTTA_HOME/wrapper-linux-x86-32-3.3.0/conf/wrapper.conf"
     
    PIDDIR="$TERRACOTTA_HOME/wrapper-linux-x86-32-3.3.0/"
  5. You should also rename $TERRACOTTA_HOME/wrapper-linux-x86-32-3.3.0/bin/testwrapper to a sensible name e.g. $TERRACOTTA_HOME/wrapper-linux-x86-32-3.3.0/bin/terracotta-wrapper.
  6. You can optionally move this terracotta-wrapper file to a different location, for example /etc/init.d/ on linux.
  7. Thats it. To run use this:
    /etc/init.d/terracotta-wrapper start

    To stop use this:

    /etc/init.d/terracotta-wrapper stop

    You can use ‘restart’ to stop and start the service, ’status’ to see the status of the service and ‘dump’ to take a thread dump of the running java program.

  8. Anything sent to System.out will be logged to the text file defined earlier (wrapper.logfile)

These instructions are only the basic ones needed to get up and running and I recommend that you read through the service wrapper docs so that you get the system that fits best with your requirements.

Please let me know if this is of some use to you, or if you have any other ideas on how to run terracotta as a service.

5 Responses to “How to run terracotta as a service”

  1. Sue Massey Says:

    Nice writing style. I look forward to reading more in the future.


  2. Blake Dworaczyk Says:

    Excellent instructions. I’ll need to deploy my terracotta-based research framework and this looks like the ‘correct’ way to run this as a service (I’m on Solaris 10).


  3. Richard Says:

    ~>Sue, thanks :)
    ~>Blake, thanks, glad you found it useful, I haven’t tried it on solaris, but I imagine that it should work just as well as on linux.

    Richard


  4. Stefan F Says:

    Nice article. Actually, I did the same (at least similarly, actually not as nice as you did it) and forgot to write about it. Damn …

    However, there is a better way to run commands in the background than using `nohup`. I was lucky enough that a work mate shared his geek skills with me and I am glad to share mine with others: ;)
    If I remember, nohup is a wrapper that catches and ignores SIGHUP signals, which is not what you want if you need your services to shut down smoothly.

    The problem people normally try to solve is that the shell kills all its running jobs when closing (sending SIGHUP to all processes). To avoid this, you just have to decouple a running process from the shell. Using bash, there are some (I think) not very well known commands that do a great job: `fg` (get background job to foreground), `bg` (decouple background job), `jobs` (list background jobs) (just to name those I use most).

    With terracotta, this would be:

    `start-terracotta-command.sh & bg`

    Or try `start-terracotta-command.sh & jobs; bg; jobs`

    Terracotta goes to the background, won’t close when you close your bash session, and shuts down smoothly when you ask it to using SIGHUP.

    See “JOB CONTROL” section in `man bash` for details


  5. Sajid Says:

    I’d use Screen for these kind of job.


Leave a Reply

retaggr