Let Tomcat is download and installed under /opt/tomcat.
Also, let tomcat be a non-provileged user under which the server will be running.
We assume that we keep server's binaries under /opt/tomcat and we will create a server instance named foo under /var/tomcat/ (carrying its own conf, logs, webapps, work, lib directories).
See also https://dzone.com/articles/running-multiple-tomcat.
Create a template service unit file at /etc/systemd/system/[email protected]:
[Unit]
Description=Tomcat - instance %i
After=syslog.target network.target
[Service]
Type=forking
User=tomcat
Group=tomcat
WorkingDirectory=/var/tomcat/%i
Environment="JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"
Environment="CATALINA_PID=/var/tomcat/%i/run/tomcat.pid"
Environment="CATALINA_BASE=/var/tomcat/%i/"
Environment="CATALINA_HOME=/opt/tomcat/"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
#RestartSec=10
#Restart=always
[Install]
WantedBy=multi-user.targetNow, we can instantiate a service instance for our foo tomcat instance:
systemctl daemon-reload
systemctl enable [email protected]
systemctl start [email protected]
It's generally bad practice to run shell scripts in systemd's
ExecStartif a native command could be used, it's unfortunately what is still often shipped in distribution packages for Java and Node applications. Thanks for the link - interesting read. Your sample file is good - just keeping the variables in anEnvironmentFilewould make for an easy transition to an instantiated service if required. Additionally, it makes it easier to change parameters, as editing variables inside the unit file requires adaemon-reload- but of course, that may not be a concern for services which stay consistent.