First of all, a Linux Service is an application that runs in the background and performs an essential task. One of the advantages to use a service is that you do not need to start it manually, you can configure it to start with the system using this command:
sudo systemctl enable <service_name>
Some of the most commonly used services are:
- httpd
- mysql
- chronyd
- sshd
You can list all the services inside your Server using
systemctl list-units --type=service
Also you can see the status of an specific service using:
systemctl status <service_name>
Let see an example:
[ernesto.lopez@test-vm ~]$ systemctl status chronyd.service
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2021-11-02 12:31:04 MST; 3 weeks 3 days ago
Docs: man:chronyd(8)
man:chrony.conf(5)
Main PID: 1212 (chronyd)
Tasks: 1 (limit: 98556)
Memory: 1.1M
CGroup: /system.slice/chronyd.service
└─1256 /usr/sbin/chronyd
To explain this output:
- chronyd.service - NTP client/server: is the name of the service and a small description of it.
- Loaded: loaded (/usr/lib/systemd/system/chronyd.service; : means that the services located in the path that appears was loaded in memory
-
enabled; vendor preset: enabled) : this part indicate that the service is enable, so it will start at boot, this is achieved using the command
sudo systemctl enable - Active: active (running) : this means that the service is up and running in the system, this line usually appears on green if you are using a normal user. This line also notifies the user when this service was started.
-
Main PID: 1212 (chronyd) : this line shows the process ID for this service. you can then use
ps 1212to get the command associated with the service.
These lines represent an important aspect to evaluate a service, cGroup deserve a single post entry.
NOTE Before converting anything to a service, make sure you have installed java on your server. A quick using dnf and java 8 example:
sudo dnf -y update
sudo dnf -y install java-1.8.0-openjdk-devel
java –version
#Find your java home path
sudo alternatives --config java
Add this line into your profile file (/etc/profile) to easier the following steps:
export JAVA_HOME=$(dirname $(dirname $(readlink $(readlink >$(which javac)))))
export PATH=$PATH:$JAVA_HOME/bin
export >CLASSPATH=.:$JAVE_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
Save the file and set the system to use this profile
sudo source /etc/profile
You can verify that the configurations were correct, by running:
echo $JAVA_HOME
echo $PATH
echo $CLASSPATH
Back to the starting our java app, suppose our app is in a .jar file called my-own-app.jar
JAR stands for Java ARCHIVE, it is a file format used to aggregate many java files into one.
More on the official documentation from Oracle
And for example we have our application stored inside /opt/my-own-app/ directory
First thing that we are going to do is to create a script that start the app, imagine we are going to convert our java app in a bash script (Just an imagination exercise!)
cd /opt/my-own-app
touch my-own-app.sh
vi !$
Then, we need to tell the script to start the app in the .jar file
#!/bin/bash
# Script to start MyOwnApp
echo "--------------------WAIT-------------------"
# Start the app
# minimum heap 512MB, maximum heap 1GB
cd /opt/my-own-app
java -Xms512M -Xmx1G -jar my-own-app.jar &
Here we are creating a script that move tho the directory where the .jar file is located and then execute the java command which is used to launch a java application. The elements to consider:
- -Xms512M specifies the initial sizeo of the memory allocation pool, in this case we append M to indicates it is megabyte. This value must be determined based on app consumption.
- -Xmx1G is the maximum size of the memory allocation pool, this case indicates 1G but can vary depending on your app.
-
-jar define the location of the jar file, because in the previous step in the script we move to the
/opt/my-own-appdir, we use just the name of the file in this case.
Save the file and change the permissions to make it an executable:
sudo chmod u+rwx my-own-app.sh
ls -l | grep my-own-app.sh
Next step is to create a service unit:
vi /etc/systemd/system/my-own-app.service
Note A service unit describes how to manage a service or application on the server.
Insert the following information on the file:
[Unit]
Description=my own app starting
After=network.target
[Service]
Type=forking
ExecStart=/opt/my-own-app/my-own-app.sh
TimeoutStartSec=0
[Install]
WantedBy=default.target
The important aspects of this:
-
WantedBy=default.target defines how a unit should be enabled, this represents the default and will create a file
.wantappend inside/etc/systemd/directory - Type=forking tells the systemd that the process is still running even though the parent process exited.
- ExecStart=/opt/my-own-app/my-own-app.sh is the file to be executed.
- After=network.target the service must be started after network services.
The following step is to reload the systemd daemon
sudo systemctl daemon-reload
And finally enable and start the service
sudo systemctl start my-own-app.service
sudo systemctl enable my-own-app.service
You can verify if the service started ok or if there was any trouble using
sudo systemctl status my-own-app.service
Top comments (0)