On peut être amené à devoir créer manuellement un service pour une application.
Pour le contexte j'ai été amené à le faire pour le proxy ldap de inWebo dont la documentation est sur https://docs.trustbuilder.com/mfa/inwebo-ldap-proxy-v1-6-installation-and-configurat
Cette documentation explique bien comment créer un service mais avec l'ancien système SysV et non pas avec systemd.
Pour commencer, sous Linux la déclaration manuelle d'un service doit se faire dans /etc/systemd/system et pas ailleurs. Donc pour créer un service, adaptez ceci
cd /etc/systemd/system
nano inwebo.service
Lien vers le fichier : cliquez ici
La configuration a été faite ainsi et nous allons la passer en détail
[Unit]
Description=Inweboservice
After=syslog.target network.target
[Service]
Type=simple
AmbientCapabilities=CAP_NET_BIND_SERVICE
WorkingDirectory=/opt/ldap-proxy-1.6.1/bin
ExecStart=java-Djava.util.logging.config.file=../config/logging.properties -jar../lib/iwLdapProxy.jar ../config/config.properties
ExecStop=/bin/kill -TERM $MAINPID
ExecStopPost=/bin/rm -f /opt/ldap-proxy-1.6.1/bin/proxy_ldap.lock
User=inwebo
Group=inwebo
UMask=0007
RestartSec=10
Restart=always
TimeoutStopSec=10
[Install]
WantedBy=multi-user.target
Lien vers le fichier : cliquez ici
Voici les explications
After=syslog.target network.target |
pour que le service soit démarré après le syslog et le réseau. |
Type=simple |
parce qu'on lance directement le process java. Si on pointait sur un script qui aurait mis le process en arrière plan on aurait dû mettre Type=forking |
AmbientCapabilities=CAP_NET_BIND_SERVICE |
pour autoriser le processus à écouter sur des ports <1024 sans être root. |
WorkingDirectory=/opt/ldap-proxy-1.6.1/bin |
pour indiquer où est le processus à lancer. C'est important car ensuite on donne des chemins relatifs dans la commande de lancement (ExecStart) |
ExecStart=java -Djava.util.logging.config.file=../config/logging.properties etc .. |
le process à lancer cad java avec des arguments relatifs |
ExecStop=/bin/kill -TERM $MAINPID |
Pour arrêter le service on envoit un signal SIGTERM au pid du process de java pour faire un arrêt propre |
| ExecStopPost=/bin/rm -f /opt/ldap-proxy-1.6.1/bin/proxy_ldap.lock | Efface le fichier proxy_ldap.lock après avoir arrêté le process |
User=inwebo |
défini le user avec lequel le service/process doit tourner |
Group=inwebo |
défini le user avec lequel le service/process doit tourner |
UMask=0007 |
Pour que les fichiers créés par le service soient accessibles uniquement à l’utilisateur et au groupe, pas aux autres. |
| Restart=always | pour que systemd redémarre le service automatiquement |
| RestartSec=10 | délai de 10 secondes avant redémarrage |
| TimeoutStopSec=10 | délai pour que systemd considère le service arrêté correctement avant de forcer un kill. |
| WantedBy=multi-user.target | Permet de lancer le service au démarrage avec le niveau multi-user, avec le réseau actif, sans interface graphique (équivalent au runlevel 3 dans sysV). |
En complément il faut créer le compte en tant que service
sudo useradd -r -s/bin/false inwebo
Lien vers le fichier : cliquez ici
Donner les droits au compte sur le répertoire qui contient l'exe
sudo chown -R inwebo:inwebo /opt/ldap-proxy-1.6.1
Lien vers le fichier : cliquez ici
Activer le service, le lancer et afficher son status
systemctl enable inwebo.service
systemctl daemon-reload
systemctl start inwebo.service
systemctl status inwebo.service
Lien vers le fichier : cliquez ici
Il faut noter que si on avait pas pointer directement sur l'exe de Java mais sur un script qui effectue un détachement, cad qu'il lance un process et qu'il s'en détache, cad qu'il le lance en arrière plan, il aurait fallu passer le type de service de simple à forking.
Exemple
#!/bin/bash
java -jar /opt/ldap-proxy-1.6.1/lib/iwLdapProxy.jar &
echo $! > /var/run/ldap-proxy.pid
Lien vers le fichier : cliquez ici
Dans le service il aurait alors fallu ajouter l'option PIDFile qui contient le pid du process qui a été détaché.
[Service]
Type=forking
PIDFile=/var/run/app.pid
ExecStart=/opt/app/start.sh
Lien vers le fichier : cliquez ici
Notez qu'il n'aurait pas été nécessaire d'adapter l'ExeStop car $MAINPID aurait récupéré le pid contenu dans le fichier qui a été renseigné dans PIDFile.
Article(s) précédent(s)