web-dev-qa-db-fra.com

Service Systemd, Working Directory ne change pas le répertoire

J'ai créé ce script:

[Unit]
Description=test

[Service]
WorkingDirectory=/home/someuser
ExecStart=/somescript.sh

Restart=always
RestartSec=10

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=autodeploy

Environment=NODE_ENV=production PORT=1494

[Install]
WantedBy=multi-user.target

Mais quand je le lance, il dit:

Process: 8986 ExecStart=/somescript.sh (code=exited, status=203/EXEC)

J'ai compris que ce message signifiait que le script ne serait pas trouvé ... Pourquoi Working Directory ne fonctionne-t-il pas pour moi?

Merci.

3
Roi Amiel

Le paramètre systemd paramètre __ WorkingDirectory= définit le répertoire dans lequel le service sera lancé, comme lorsque vous utilisiez cdpour modifier un répertoire lorsque vous travaillez dans le shell.

Cela ne signifie pas que tous les autres chemins (y compris celui de ExecStart=) seront désormais relatifs à celui-ci, vous devez donc toujours spécifier le chemin de votre script dans cette directive:

ExecStart=/home/someuser/somescript.sh

Peut-être pensiez-vous à RootDirectory= directive ? Ce répertoire utilise la commande chrootpour permuter la racine du système de fichiers vu par le processus par le répertoire que vous spécifiez. Par conséquent, si vous utilisez / pour l'emplacement du script, cela ressemble peut-être à ce que vous vouliez ... Cependant, utilisez RootDirectory= nécessite que vous ayez une image système, avec des fichiers binaires et des bibliothèques. Par exemple, vous devez disposer d'un /bin/sh pour exécuter votre script Shell et d'un /lib avec une libc, etc. En règle générale, vous ne pouvez pas utiliser RootDirectory= dans n'importe quel répertoire de votre choix ...

Donc, mon conseil pour résoudre le problème que vous voyez est de simplement mettre à jour le ExecStart= pour répertorier le chemin complet de votre script.

4
filbranden