How to Start and Restart Tomcat Server as a Service
Apache Tomcat is a web server and servlet container that is used to serve Java applications. A servlet is a Java technology-based Web component, managed by a container, that generates dynamic content.
1. The tools
- Debian based Linux distribution
- Microsoft Windows
- Java JDK
- Apache Tomcat
2. Introduction
When you download Apache Tomcat binary distribution, you need to unzip the folder. Every time you are going to use the server, you need to start and stop its service manually.
Most of the time, is needed to start the server with the system. To start/stop/restart the server, Tomcat provide some utilities. In this example we are going to install tomcat as a service and use the utilities provided by Tomcat to start/stop/restart the tomcat service.
3. Prerequisites
- JDK installed
4. Download Tomcat
Go to the page
- https://tomcat.apache.org/download-80.cgi and download the tomcat server as a zip compressed file for windows.
Download the tomcat server as a tar.gz compressed file for Linux.
5. Tomcat in Windows
5.1 Unzip Tomcat
Unzip the tomcat downloaded zip in the folder you want to have it.
5.2 Open the terminal console
Open the terminal and go to the folder where Tomcat is unzipped.
5.3 Install service
go to the bin folder and type the command:
Install service
C:\Java\Apache Tomcat 8.0.27\bin>service install
This command install the Tomcat service in Windows. You should get the following output
Install service output
Installing the service 'Tomcat8' ... Using CATALINA_HOME: "C:\Java\Apache Tomcat 8.0.27" Using CATALINA_BASE: "C:\Java\Apache Tomcat 8.0.27" Using JAVA_HOME: "C:\Java\jdk1.8.0_40" Using JRE_HOME: "C:\Java\jdk1.8.0_40\jre" Using JVM: "C:\Java\jdk1.8.0_40\jre\bin\server\jvm.dll" The service 'Tomcat8' has been installed.
5.4 Check service
You can check if the service is properly installed with the windows commands for services. Type the command
Check service
C:\Java\Apache Tomcat 8.0.27\bin>sc query Tomcat8
You should get an output similar to this:
sc query output
SERVICE_NAME: Tomcat8 TYPE : 10 WIN32_OWN_PROCESS STATUS : 1 STOPPED WIN32_OUTPUT_CODE : 1077 (0x435) SERVICE_OUTPUT_CODE : 0 (0x0) CONTROL_POINT : 0x0 WAIT : 0x0
When you install the service, the service is stopped.
5.5 Start service
To start the service type this command:
Start tomcat service
C:\Java\Apache Tomcat 8.0.27\bin>sc start tomcat8
You should get an output similar to this:
Start service output
SERVICE_NAME: tomcat8 TYPE : 10 WIN32_OWN_PROCESS STATUS : 2 START_PENDING (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN) WIN32_OUTPUT_CODE : 0 (0x0) SERVICE-OUTPUT_CODE: 0 (0x0) COMPROB_POINT : 0x0 INITIAL-STATUS : 0x7d0 PID : 908 MARKS :
It takes a while to start the service. Note that the status starts pending. You can check the service status with:
Check service
C:\Java\Apache Tomcat 8.0.27\bin>sc query Tomcat8
Wait until the service is started.
sc query output
SERVICE_NAME: Tomcat8 TYPE : 10 WIN32_OWN_PROCESS STATUS : 3 STARTED WIN32_OUTPUT_CODE : 1077 (0x435) SERVICE_OUTPUT_CODE : 0 (0x0) CONTROL_POINT : 0x0 WAIT : 0x0
Open the URL http://localhost:8080
in the browser and check that Tomcat is working. You should get the Tomcat Welcome screen:
5.6 Stop service
To stop the Tomcat service type this command:
Stop tomcat service
C:\Java\Apache Tomcat 8.0.27\bin>sc stop tomcat8
You should get an output similar to this:
Stop service output
NOMBRE_SERVICIO: tomcat8 TYPE : 10 WIN32_OWN_PROCESS STATUS : 3 STOP_PENDING (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN) WIN32_OUTPUT_CODE : 0 (0x0) SERVICE-OUTPUT_CODE: 0 (0x0) COMPROB_POINT : 0x0 INITIAL-STATUS : 0x7d0 PID : 908 MARKS :
It takes a while to stop the service. Note the status STOP_PENDING
. You can check the service status with:
Check service
C:\Java\Apache Tomcat 8.0.27\bin>sc query Tomcat8
Wait until the service is stopped.
5.7 Autostart service
If you need to start the service when Windows start, type the following command:
Autostart service
C:\Java\Apache Tomcat 8.0.27\bin>sc config Tomcat8 start= auto
You should get an output similar to this:
Autostart service output
[SC] ChangeServiceConfig OK
Now restart the computer and check that Tomcat is starting when the system starts.
5.8 Remove service
If you need to remove the service, type the following command:
Remove service
C:\Java\Apache Tomcat 8.0.27\bin>service remove
And you should get the following output:
Remove service output
Removing the service 'Tomcat8' ... Using CATALINA_BASE: "C:\Java\Apache Tomcat 8.0.27" The service 'Tomcat8' has been removed
6. Tomcat in Linux
Every Linux distribution has its own way to manage services. This procedure should work in deb based distributions. We are going to make this on Debian 8 Linux distribution.
6.1 Uncompress the tomcat folder
Open your Linux terminal.
Work as a superuser. Type the following command:
Superuser login
su
write your superuser password.
Copy the tomcat compressed file to the /opt
directory.
Copy compressed file
cp /path_to_file/tomcat8.tar.gz /opt
go to the /opt
directory.
Go to opt
cd /opt
Uncompress the tomcat file
Uncompress tomcat
tar -zxvf tomcat8.tar.gz
6.2 Create the service script
To work with tomcat as a service in Linux, we are going to create a script for this purpose
Init scripts folder
cd /etc/init.d
In this folder create the file tomcat and give the appropriate permissions to the file.
Script permissions
chown tomcat:tomcat tomcat8 chmod 755 tomcat8
Edit the file with your favorite editor.
Edit script
vi tomcat8
6.3 Script content
6.3.1 Script header
Script header
#!/bin/bash ### BEGIN INIT INFO # Provides: tomcat8 # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Apache Tomcat # Description: Open source web server and Servlet container ### END INIT INFO
The header of the script is very important because it is used by the system to properly execute the script.
#!/bin/bash
Indicates that this is a bash script.
### BEGIN INIT INFO
This mark the beginning of the header.
# Provides: tomcat8
Indicates what is provided by the script.
# Required-Start: $remote_fs $syslog
Runlevels required to start.
# Default-Start: 2 3 4 5
Default start runlevels.
# Default-Stop: 0 1 6
Default stop runlevels.
# Short-Description: Apache Tomcat
A short description
# Description: Open source web server and Servlet container
A long description
### END INIT INFO
Mark the end of the header.
6.3.2 Initialize variables
Initialization variables
export JAVA_HOME=/usr/lib/jvm/java-8-oracle export PATH=$JAVA_HOME/bin:$PATH export CATALINA_HOME=/opt/apache-tomcat-8.0.33 export CATALINA_BASE=/opt/apache-tomcat-8.0.33 TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}" SHUTDOWN_WAIT=20
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
JAVA_HOME is the directory where the JDK is located.
export PATH=$JAVA_HOME/bin:$PATH
The bin JAVA_HOME is exported to the PATH to use it everywhere.
export CATALINA_HOME=/opt/apache-tomcat-8.0.33
Location of Tomcat directory.
export CATALINA_BASE=/opt/apache-tomcat-8.0.33
Location of Tomcat directory.
TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}"
Feedback message showed when you run the script without parameters
SHUTDOWN_WAIT=20
Waiting time to shutdown the server, to allow the server finish any pending tasks.
6.3.3 Print tomcat pid function
Tomcat PID
tomcat_pid() { echo `ps -fe | grep $CATALINA_BASE | grep -v grep | tr -s " "|cut -d" " -f2` }
This function prints the tomcat process id using some terminal utilities.
echo `ps -fe | grep $CATALINA_BASE | grep -v grep | tr -s " "|cut -d" " -f2`
prints the tomcat process id.
6.3.4 Print tomcat status function
Status function
status(){ pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m" else echo -e "\e[00;31mTomcat is not running\e[00m" fi }
pid=$(tomcat_pid)
Gets the tomcat pid.
if [ -n "$pid" ]; then echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m"
If the pid exists then tomcat is running.
else echo -e "\e[00;31mTomcat is not running\e[00m"
Prints the tomcat is not running.
6.3.5 Start tomcat function
Start function
start() { pid=$(tomcat_pid) if [ -n "$pid" ] then echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m" else echo -e "\e[00;32mStarting tomcat\e[00m" sh $CATALINA_HOME/bin/startup.sh status fi return 0 }
This function is running when you run the script with the start parameter.
pid=$(tomcat_pid)
Gets the tomcat pid
if [ -n "$pid" ]
If the pid exists.
echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m"
The tomcat server is running.
echo -e "\e[00;32mStarting tomcat\e[00m"
If the tomcat server is not running print the message that tomcat is starting.
sh $CATALINA_HOME/bin/startup.sh
Run the startup script provided by tomcat.
status
Print the status.
return 0
Return without errors.
6.3.6 Stop tomcat function
Stop function
stop() { pid=$(tomcat_pid) if [ -n "$pid" ] then echo -e "\e[00;31mStoping Tomcat\e[00m" sh $CATALINA_HOME/bin/shutdown.sh let kwait=$SHUTDOWN_WAIT count=0; until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ] do echo -n -e "\n\e[00;31mwaiting for processes to exit\e[00m"; sleep 1 let count=$count+1; done if [ $count -gt $kwait ]; then echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m" kill -9 $pid fi else echo -e "\e[00;31mTomcat is not running\e[00m" fi return 0 }
This function stops the Tomcat server
pid=$(tomcat_pid)
Gets the Tomcat PID
if [ -n "$pid" ]
If the PID doesn’t exist
echo -e "\e[00;31mStoping Tomcat\e[00m"
Prints the message that Tomcat is stopping
sh $CATALINA_HOME/bin/shutdown.sh
Runs the script provided by tomcat to stop the server.
let kwait=$SHUTDOWN_WAIT
Gets the timeout variable.
count=0;
Initializes a counter.
until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ]
Checks if the pid still exist.
echo -n -e "\n\e[00;31mwaiting for processes to exit\e[00m";
Prints a waiting message.
sleep 1
Sleeps.
let count=$count+1;
Updates the counter.
if [ $count -gt $kwait ]; then
if the counter is equal to the waiting time.
echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m"
Prints a message that the server didn’t stop before the waiting time.
kill -9 $pid
Forces to quit the server process.
echo -e "\e[00;31mTomcat is not running\e[00m"
Prints a message that the server is not running.
return 0
Returns without errors.
6.3.7 Script main body
When we run the script the parameters are selected using a case statement, to choose the right option.
Script main body
case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo -e $TOMCAT_USAGE ;; esac exit 0
case $1 in
Examines the script parameter.
start)
If the parameter is start.
start
Starts the server.
stop)
If the parameter is stop.
stop
Stops the server.
restart)
If the parameter is restart.
stop
Stops the server.
start
Start the server.
status)
If the parameter is status.
status
Prints the status.
*)
If there is no parameters other any other parameter.
echo -e $TOMCAT_USAGE
Prints the help message.
esac
End the case statement.
exit 0
Exits without errors.
6.4 The complete Linux source code
tomcat8
#!/bin/bash ### BEGIN INIT INFO # Provides: tomcat8 # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Apache Tomcat # Description: Open source web server and Servlet container ### END INIT INFO export JAVA_HOME=/usr/lib/jvm/java-8-oracle export PATH=$JAVA_HOME/bin:$PATH export CATALINA_HOME=/opt/apache-tomcat-8.0.33 export CATALINA_BASE=/opt/apache-tomcat-8.0.33 TOMCAT_USAGE="Usage: $0 {\e[00;32mstart\e[00m|\e[00;31mstop\e[00m|\e[00;32mstatus\e[00m|\e[00;31mrestart\e[00m}" SHUTDOWN_WAIT=20 tomcat_pid() { echo `ps -fe | grep $CATALINA_BASE | grep -v grep | tr -s " "|cut -d" " -f2` } start() { pid=$(tomcat_pid) if [ -n "$pid" ] then echo -e "\e[00;31mTomcat is already running (pid: $pid)\e[00m" else echo -e "\e[00;32mStarting tomcat\e[00m" sh $CATALINA_HOME/bin/startup.sh status fi return 0 } status(){ pid=$(tomcat_pid) if [ -n "$pid" ]; then echo -e "\e[00;32mTomcat is running with pid: $pid\e[00m" else echo -e "\e[00;31mTomcat is not running\e[00m" fi } stop() { pid=$(tomcat_pid) if [ -n "$pid" ] then echo -e "\e[00;31mStoping Tomcat\e[00m" sh $CATALINA_HOME/bin/shutdown.sh let kwait=$SHUTDOWN_WAIT count=0; until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $kwait ] do echo -n -e "\n\e[00;31mwaiting for processes to exit\e[00m"; sleep 1 let count=$count+1; done if [ $count -gt $kwait ]; then echo -n -e "\n\e[00;31mkilling processes which didn't stop after $SHUTDOWN_WAIT seconds\e[00m" kill -9 $pid fi else echo -e "\e[00;31mTomcat is not running\e[00m" fi return 0 } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) echo -e $TOMCAT_USAGE ;; esac exit 0
6.5 Make the script run at boot
This command is used to make Linux aware to run the script at startup.
Run at boot
update-rc.d /etc/init.d/tomcat8
6.6 Linux results
6.6.1 Run script without arguments
We run the command without arguments
tomcat
root@debian:~# /etc/init.d/tomcat8
The script shows the help.
tomcat script output
Usage: /etc/init.d/tomcat8 {start|stop|status|restart}
6.6.2 Run script with status parameter
We run the script with the status parameter
tomcat status
root@debian:~# /etc/init.d/tomcat8 status
If the service is running we get the following output:
tomcat status running output
Tomcat is running with pid: 619
If the service is not running we get the following output:
tomcat status not running output
Tomcat is not running
6.6.3 Run script with start parameter
We run the script with the start parameter
tomcat start
root@debian:~# /etc/init.d/tomcat8 start
If the server is running we get the output
tomcat start with server running output
Tomcat is already running (pid: 3445)
If the server is not running we get the output
tomcat start with server not running output
Starting tomcat Using CATALINA_BASE: /opt/apache-tomcat-8.0.33 Using CATALINA_HOME: /opt/apache-tomcat-8.0.33 Using CATALINA_TMPDIR: /opt/apache-tomcat-8.0.33/temp Using JRE_HOME: /usr/lib/jvm/java-8-oracle Using CLASSPATH: /opt/apache-tomcat-8.0.33/bin/bootstrap.jar:/opt/apache-tomcat-8.0.33/bin/tomcat-juli.jar Tomcat started. Tomcat is running with pid: 2715
6.6.4 Run script with stop parameter
We run the script with the stop parameter
tomcat stop
root@debian:~# /etc/init.d/tomcat8 stop
If the server is running we get the output
tomcat stop with server running output
Stoping Tomcat Using CATALINA_BASE: /opt/apache-tomcat-8.0.33 Using CATALINA_HOME: /opt/apache-tomcat-8.0.33 Using CATALINA_TMPDIR: /opt/apache-tomcat-8.0.33/temp Using JRE_HOME: /usr/lib/jvm/java-8-oracle Using CLASSPATH: /opt/apache-tomcat-8.0.33/bin/bootstrap.jar:/opt/apache-tomcat-8.0.33/bin/tomcat-juli.jar
If the server is not running we get the output
tomcat stop with server not running output
Tomcat is not running
6.6.5 Run script with restart parameter
We run the script with the restart parameter
tomcat restart
root@debian:~# /etc/init.d/tomcat8 restart
If the server is running we get the output
tomcat restart with server running output
Stoping Tomcat Using CATALINA_BASE: /opt/apache-tomcat-8.0.33 Using CATALINA_HOME: /opt/apache-tomcat-8.0.33 Using CATALINA_TMPDIR: /opt/apache-tomcat-8.0.33/temp Using JRE_HOME: /usr/lib/jvm/java-8-oracle Using CLASSPATH: /opt/apache-tomcat-8.0.33/bin/bootstrap.jar:/opt/apache-tomcat-8.0.33/bin/tomcat-juli.jar waiting for processes to exit Starting tomcat Using CATALINA_BASE: /opt/apache-tomcat-8.0.33 Using CATALINA_HOME: /opt/apache-tomcat-8.0.33 Using CATALINA_TMPDIR: /opt/apache-tomcat-8.0.33/temp Using JRE_HOME: /usr/lib/jvm/java-8-oracle Using CLASSPATH: /opt/apache-tomcat-8.0.33/bin/bootstrap.jar:/opt/apache-tomcat-8.0.33/bin/tomcat-juli.jar Tomcat started. Tomcat is running with pid: 2874
If the server is not running we get the output
tomcat restart with server not running output
Tomcat is not running Starting tomcat Using CATALINA_BASE: /opt/apache-tomcat-8.0.33 Using CATALINA_HOME: /opt/apache-tomcat-8.0.33 Using CATALINA_TMPDIR: /opt/apache-tomcat-8.0.33/temp Using JRE_HOME: /usr/lib/jvm/java-8-oracle Using CLASSPATH: /opt/apache-tomcat-8.0.33/bin/bootstrap.jar:/opt/apache-tomcat-8.0.33/bin/tomcat-juli.jar Tomcat started. Tomcat is running with pid: 3571
7. Download the Source Code
This was an example of how to start and restart Tomcat server as a service.