# customiser un service systemd

## bdouxx

bonjour

Avec openrc, il y avait le répertoire /etc/conf.d pour pouvoir changer les valeurs sans que cela soit écrasé a chaque mise à  jour. 

Comment est on censé faire avec systemd?

Actuellement j('ai envie de changer le port de jenkins-bin pour le mettre a 8081, j'y arrive bien en modifiant le fichier /usr/lib/systemd/system/jenkins.service mais je me dis qu'a la prochaine mise a jour cela va être écrasé , et je ne vois pas bien comment faire autrement.

j'aurai bien fait récupérer les info du répertoire conf.d par le service mais cela semble déconseillé.

https://wiki.gentoo.org/wiki/Project:Systemd/conf.d_files

----------

## guitou

Hello.

La logique Linux voudrait que ca se fasse dans /etc, et dans cette perspective le repertoire /etc/systemd me semble un bon candidat.

++

Gi)

----------

## bdouxx

Le problème est que les fichiers présents dans ce répertoire sont normalement créé par la commande "systemctl enable nom_du_service", un lien symbolique est créé vers le fichier de /usr/lib/systemd/system/

Donc si je copie le fichier actuel pour le modifier, il ne me sera jamais proposé de le mettre à  jour en cas de nouvelle version.

Si je ne me trompe pas, dans /etc/conf.d/ si une mise à jour est nécessaire, on nous propose quoi faire ( zap, merge ...)

----------

## sebB

Salut,

Regarde là si ca peut t'aider.

 *Quote:*   

> Variable value
> 
> However, the above solution doesn't work well when sysadmin is supposed to change the value of the environment variable locally. More specifically, the new value would need to be set every time the unit file is updated.
> 
> For this case, an extra file is to be used. How — usually depends on the distribution policy.
> ...

 

----------

## GentooUser@Clubic

La "bonne" méthode est de créer un fichier /etc/systemd/system/jenkins.service.d/override.conf qui va contenir un truc du genre :

```
[Service]

ExecStart=

ExecStart=/usr/bin/java -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins/home -jar /opt/jenkins/jenkins.war --daemon --logfile=/var/log/jenkins/jenkins.log --httpPort=8081 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20 --accessLoggerClassName=winstone.accesslog.SimpleAccessLogger --simpleAccessLogger.format=combined --simpleAccessLogger.file=/var/log/jenkins/access_log

```

Note le besoin de vider la variable avant de pouvoir la redéfinir.

Si tu tape systemctl edit jenkins ça va créer le fichier et ouvrir directement un éditeur.

Par contre, si la commande ExecStart change dans le .service original, il faudra mettre à jour ta version.

----------

## bdouxx

nickel, merci

Je vais continuer de lire la doc sur systemd pour voir comment gérer les variables, passer certains arguments dans une variable est lever un bug pour mettre à jour les fichiers de l'ebuild.

----------

## Syl20

Pour être sûr de ne pas te tromper sur le chemin et le nom du fichier, penche-toi sur la commande 

```
# systemctl edit
```

----------

## k-root

 *bdouxx wrote:*   

> Actuellement j('ai envie de changer le port de jenkins-bin pour le mettre a 8081, j'y arrive bien en modifiant le fichier /usr/lib/systemd/system/jenkins.service mais je me dis qu'a la prochaine mise a jour cela va être écrasé , et je ne vois pas bien comment faire autrement.
> 
> 

 

Instanced service units ->  https://www.freedesktop.org/software/systemd/man/systemd.service.html

exemple : https://fedoramagazine.org/systemd-template-unit-files/

exemple bis avec postgresql et gentoo : https://www.kprod.eu/blog/?p=121

----------

## bdouxx

merci pour vos éclaircissements.

en me basant sur le fichier jenkins-bin.confd pour faire le fichier jenkins-bin.service, voila ce que j'obtiens.

par contre GentooUser@Clubic, je ne vois trouvé pourquoi il faut vider la variable avant

```
[Unit]

Description=Jenkins Daemon

[Service]

# Directory where Jenkins store its configuration and working files (checkouts, build reports, artifacts, ...).

Environment=JENKINS_HOME=/var/lib/jenkins/home

# Options to pass to java when running Jenkins.

Environment=JENKINS_JAVA_OPTIONS=-Djava.awt.headless=true

# Port Jenkins is listening on.

Environment=JENKINS_PORT=8080

# Debug level for logs -- the higher the value, the more verbose. 5 is INFO.

Environment=JENKINS_DEBUG_LEVEL=5

# Maximum number of HTTP worker threads.

Environment=JENKINS_HANDLER_MAX=100

# Maximum number of idle HTTP worker threads.

Environment=JENKINS_HANDLER_IDLE=20

# War File

Environment=JENKINS_WAR=/opt/jenkins/jenkins.war

Type=forking

ExecStart=/usr/bin/java $JENKINS_JAVA_OPTIONS -DJENKINS_HOME=${JENKINS_HOME} -jar ${JENKINS_WAR} --daemon --logfile=/var/log/jenkins/jenkins.log --httpPort=${JENKINS_PORT} --debug=${JENKINS_DEBUG_LEVEL} --handlerCountMax=${JENKINS_HANDLER_MAX} --handlerCountMaxIdle=${JENKINS_HANDLER_IDLE} --accessLoggerClassName=winstone.accesslog.SimpleAccessLogger --simpleAccessLogger.format=combined --simpleAccessLogger.file=/var/log/jenkins/access_log

User=jenkins

[Install]

WantedBy=multi-user.target
```

mon fichier /etc/systemd/system/jenkins.service.d/override.conf que j'édite via "systemctl edit jenkins.service"

est le suivant :

```
[Service]

Environment=JENKINS_PORT=8081
```

En faisant ainsi, cela fonctionne sur mon ordi, cela vous semble correct ? si oui, je vais déclarer le bug.

Merci encore

----------

