Creating an Init Script in Ubuntu 14.04

In Ubuntu, you create init scripts using the SysV init system. Details are here. In this article, I will create a very simple script to start and stop Tomcat.

In this tutorial, our goal is to start and stop Tomcat as the user “joe”. First, we will create a script called tomcat in /etc/init.d folder.

#! /bin/sh
### BEGIN INIT INFO
# Provides: tomcat
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Tomcat
# Description: This file starts and stops Tomcat server
# 
### END INIT INFO

TOMCAT_DIR=/home/joe/programs/apache-tomcat-8.0.5/
export JAVA_HOME=/home/joe/programs/jdk1.8.0_05

case "$1" in
 start)
   su joe -c $TOMCAT_DIR/bin/startup.sh
   ;;
 stop)
   su joe -c $TOMCAT_DIR/bin/shutdown.sh
   sleep 10
   ;;
 restart)
   su joe -c $TOMCAT_DIR/bin/shutdown.sh
   sleep 20
   su joe -c $TOMCAT_DIR/bin/startup.sh
   ;;
 *)
   echo "Usage: tomcat {start|stop|restart}" >&2
   exit 3
   ;;
esac

The “Default-Start” field specifies the run levels in which the script will be run with the “start” argument. “Default-Stop” does the reverse. For example, when the machines shuts down and enters run level 1, the script will be run with the “stop” argument.

Make the script executable:

sudo chmod a+x tomcat

Always unit test the script by running it from the command line. For example:

sudo ./tomcat start
sudo ./tomcat stop

If all goes well then register the script as an init script:

sudo update-rc.d tomcat defaults

Reboot the machine and make sure that Tomcat has started.

8 thoughts on “Creating an Init Script in Ubuntu 14.04

  1. This is nice!
    Except that it doesn’t work anymore for some new daemon.
    update-rc.d is not valid for the new stuff.
    The rc system actually worked fine until somebody decided to break it.
    Maybe the old SysV worked too well and is too simple to understand.
    I havn’t found a command line which can replace the old update-rc.d

    If somebody could explain how the new system works this would be nice.

    Good article anyway.

  2. I personally use, and believe that start-stop-daemon is a better choice for running an application or script as a certain user.

    Example:

    #! /bin/sh
    ### BEGIN INIT INFO
    # Provides: Looker
    # Required-Start: $remote_fs $syslog
    # Required-Stop: $remote_fs $syslog
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: Looker
    # Description: Looker
    ### END INIT INFO

    # DON’T DELETE THE INIT INFO!!!!!!!!!!!!

    # Author: Alex.Vanino@gmail.com

    # Configuration for this script.
    DESC=”looker”
    NAME=looker
    DAEMON=/home/looker/looker/$NAME
    DAEMON_ARGS=”start”
    PIDFILE=/var/run/$NAME.pid
    SCRIPTNAME=/etc/init.d/$NAME
    RUNAS=looker

    # Function that starts the daemon/service
    do_start()
    {
    start-stop-daemon –start –background –quiet –pidfile $PIDFILE -c $RUNAS –exec $DAEMON –test > /dev/null \
    || return 1
    start-stop-daemon –start –background –quiet –pidfile $PIDFILE -c $RUNAS –exec $DAEMON — \
    $DAEMON_ARGS \
    || return 2
    }

    -c is the argument that you use to run as another user. For example: -c root

  3. I think my needs are a bit simpler, but I am unclear on the necessary syntax.
    I am trying to fix a laptop for a friend and have almost everything working as needed, but to enable an older Broadcom B4311 wifi adapter, it is requiring entering the following in terminal after every reboot:
    ———————————–
    sudo modprobe -r b43
    sudo modprobe b43
    sudo rfkill unblock all
    ———————————–
    I am trying to automate this at startup by using an init script, which ideally should not require any input at all (hopefully, not even an su password). I am not certain how to do so.

  4. Dude you just made my day… no.. you just saved my life.. Thanks a ton.. I can’t explain how badly I needed this article…

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.