Ejecutando chdir antes de iniciar el servicio systemd

148

Pregunta: ¿Puedo iniciar un proceso con systemd y asignar a ese proceso un directorio de trabajo de mi elección?

Tengo un servicio con el que quiero comenzar systemd. Cuando se inicia ese servicio, quiero poder asignarle un directorio de trabajo actual. Sé cómo hacer esto si estaba usando init, pero estoy teniendo problemas systemd.

Esto es lo que he estado tratando de hacer funcionar.

Mi servicio

Creé una utilidad simple ("listdir"), escrita en Python y colocada en /opt/bin/listdir:

#! /usr/bin/python

import os

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

Mi archivo de configuración

Luego creé un listdir.servicearchivo systemdy lo coloqué aquí /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

Problema

Cuando ejecuto systemctl start listdirmi registro del sistema registra el directorio raíz ("/") como el directorio de trabajo actual. Por supuesto, lo esperaba /usr/localcomo el directorio actual, ya que pensé ExecStartPreque cambiaría los directorios antes de comenzar el proceso.

Obviamente, estoy imaginando que systemdfuncionaría algo así como un script de shell (aunque sé que no es un script de shell). ¿Alguien puede darme una idea de lo que debería estar haciendo? ¿Es posible establecer un directorio de trabajo usando systemd? ¡Gracias!


Editar: el registro de mi sistema informa un error. (Acabo de notar.)

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

Entonces, chdires un comando de shell, y no un ejecutable en sí mismo. Bueno. ¿Pero todavía hay alguna forma de cambiar los directorios usando systemd?

Mario
fuente

Respuestas:

271

En systemd> = 227 deberías poder usar:

[Service]
WorkingDirectory=/usr/local

para que tu script se ejecute allí.

( DOCS )

Eric Renouf
fuente
44
¿Cómo encontraste esto? ¡No se menciona en ninguna parte de la documentación !
jameshfisher
2
@jameshfisher está en esta parte de la documentación
Eric Renouf
3
@EricRenouf aha, deberían simplemente duplicar esas opciones compartidas en la documentación del servicio
jameshfisher
3
Entonces, solo por claridad, ¿iría esto en la [Service]sección?
dthor
44
Respondiéndome, funcionó en el último CentOS 7, a pesar de la versión.
BrunoJCM