Exécuter chdir avant de démarrer le service systemd

149

Question: Puis-je lancer un processus avec systemd et lui attribuer un répertoire de travail de mon choix?

J'ai un service avec lequel je veux commencer systemd. Lors du démarrage de ce service, je souhaite pouvoir lui attribuer un répertoire de travail en cours. Je sais comment faire si j'utilisais init, mais j'ai des problèmes avec systemd.

Voici ce que j'ai essayé de faire fonctionner.

Mon service

J'ai créé un utilitaire simple ("listdir"), écrit en Python et placé dans /opt/bin/listdir:

#! /usr/bin/python

import os

print 'Current working directory: %s' % (os.getcwd())

Mon fichier de configuration

J'ai ensuite créé un listdir.servicefichier pour systemdet l' ai placé ici /lib/systemd/system/listdir.service:

[Unit]
Description=Test of listing CWD.

[Service]
ExecStartPre=chdir /usr/local
ExecStart=/opt/bin/listdir
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

Problème

Lorsque je lance systemctl start listdirmon journal système, le répertoire racine ("/") est enregistré comme répertoire de travail actuel. Bien sûr, je m'attendais /usr/localau répertoire actuel, car je pensais pouvoir ExecStartPrechanger de répertoire avant de lancer le processus.

Évidemment, j'imagine que systemdcela fonctionnerait comme un script shell (même si je sais que ce n'est pas un script shell). Quelqu'un peut-il me donner une idée de ce que je devrais faire? Est-il même possible de définir un répertoire de travail en utilisant systemd? Merci!


Modifier: mon journal système signale une erreur. (Je viens de remarquer.)

Executable path is not absolute, ignoring: chdir /usr/local 

Donc, chdirest une commande shell, et non un exécutable lui-même. D'accord. Mais est-il encore possible pour moi de changer de répertoire à l'aide systemd?

Mario
la source

Réponses:

272

Sur systemd> = 227, vous devriez pouvoir utiliser:

[Service]
WorkingDirectory=/usr/local

pour que votre script soit exécuté là-bas.

( DOCS )

Eric Renouf
la source
4
Comment avez-vous trouvé cela? Ce n'est mentionné nulle part dans la documentation !
jameshfisher
2
@jameshfisher c'est dans cette partie de la documentation
Eric Renouf
3
@EricRenouf aha, ils doivent simplement dupliquer ces options partagées dans la documentation du service
jameshfisher
3
Alors juste pour plus de clarté, cela irait-il dans la [Service]section?
dthor
4
En me répondant, cela fonctionnait sur le dernier CentOS 7, malgré la version.
BrunoJCM