Spring Boot application as a Service
The following works for springboot 1.3 and above:
As init.d service
The executable jar has the usual start, stop, restart, and status commands. It will also set up a PID file in the usual /var/run directory and logging in the usual /var/log directory by default.
You just need to symlink your jar into /etc/init.d like so
sudo link -s /var/myapp/myapp.jar /etc/init.d/myapp
OR
sudo ln -s ~/myproject/build/libs/myapp-1.0.jar /etc/init.d/myapp_servicename
After that you can do the usual
/etc/init.d/myapp start
Then setup a link in whichever runlevel you want the app to start/stop in on boot if so desired.
As a systemd service
To run a Spring Boot application installed in var/myapp you can add the following script in /etc/systemd/system/myapp.service:
[Unit]Description=myappAfter=syslog.target[Service]ExecStart=/var/myapp/myapp.jar[Install]WantedBy=multi-user.target
NB: in case you are using this method, do not forget to make the jar file itself executable (with chmod +x) otherwise it will fail with error "Permission denied".
Reference
What follows is the easiest way to install a Java application as system service in Linux.
Let's assume you are using systemd
(which any modern distro nowadays does):
Firstly, create a service file in /etc/systemd/system
named e.g. javaservice.service
with this content:
[Unit]Description=Java Service[Service]User=nobody# The configuration file application.properties should be here:WorkingDirectory=/data ExecStart=/usr/bin/java -Xmx256m -jar application.jar --server.port=8081SuccessExitStatus=143TimeoutStopSec=10Restart=on-failureRestartSec=5[Install]WantedBy=multi-user.target
Secondly, notify systemd
of the new service file:
systemctl daemon-reload
and enable it, so it runs on boot:
systemctl enable javaservice.service
Eventually, you can use the following commands to start/stop your new service:
systemctl start javaservicesystemctl stop javaservicesystemctl restart javaservicesystemctl status javaservice
Provided you are using systemd
, this is the most non-intrusive and clean way to set up a Java application as system-service.
What I like especially about this solution is the fact that you don't need to install and configure any other software. The shipped systemd
does all the work for you, and your service behaves like any other system service. I use it in production for a while now, on different distros, and it just works as you would expect.
Another plus is that, by using /usr/bin/java
, you can easily add jvm
paramters such as -Xmx256m
.
Also read the systemd
part in the official Spring Boot documentation:http://docs.spring.io/spring-boot/docs/current/reference/html/deployment-install.html
You could also use supervisord which is a very handy daemon, which can be used to easily control services. These services are defined by simple configuration files defining what to execute with which user in which directory and so forth, there are a zillion options. supervisord has a very simple syntax, so it makes a very good alternative to writing SysV init scripts.
Here a simple supervisord configuration file for the program you are trying to run/control. (put this into /etc/supervisor/conf.d/yourapp.conf)
/etc/supervisor/conf.d/yourapp.conf
[program:yourapp]command=/usr/bin/java -jar /path/to/application.jaruser=usertorunautostart=trueautorestart=truestartsecs=10startretries=3stdout_logfile=/var/log/yourapp-stdout.logstderr_logfile=/var/log/yourapp-stderr.log
To control the application you would need to execute supervisorctl, which will present you with a prompt where you could start, stop, status yourapp.
CLI
# sudo supervisorctlyourapp RUNNING pid 123123, uptime 1 day, 15:00:00supervisor> stop yourappsupervisor> start yourapp
If the supervisord
daemon is already running and you've added the configuration for your serivce without restarting the daemon you can simply do a reread
and update
command in the supervisorctl
shell.
This really gives you all the flexibilites you would have using SysV Init scripts, but easy to use and control. Take a look at the documentation.