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.
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.
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
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.
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…