287 votos

Cómo establecer la variable de entorno en el servicio de systemd?

Tengo un Arch Linux sistema con systemd y he creado mi propio servicio. El servicio de configuración en /etc/systemd/system/myservice.service tiene este aspecto:

[Unit]
Description=My Daemon

[Service]
ExecStart=/bin/myforegroundcmd

[Install]
WantedBy=multi-user.target

Ahora quiero tener un ambiente en el conjunto de variables de la /bin/myforegroundcmd. ¿Cómo puedo hacer eso?

366voto

Michael Hampton Puntos 88271

La forma recomendada de hacerlo es crear un archivo /etc/sysconfig/myservice que contiene las variables y, a continuación, cargarlos con EnvironmentFile.

Para los detalles completos, consulte la documentación de Fedora sobre cómo escribir un systemd secuencia de comandos.

109voto

Michał Górny Puntos 351

La respuesta depende de si la variable que se supone debe ser constante (es decir, no deben ser modificados por el usuario reciba la unidad) o variable (se supone que para ser configurado por el usuario).

Ya que es su local de la unidad, el límite es muy borrosa y de cualquier forma iba a funcionar. Sin embargo, si usted comenzó a distribuir y que acabaría en /usr/lib/systemd/system, esto vendría a ser importante.

El valor de la constante

Si el valor no necesita cambiar por ejemplo, la forma preferida sería el lugar como Environment=, directamente en la unidad de archivo:

[Unit]
Description=My Daemon

[Service]
Environment="FOO=bar baz"
ExecStart=/bin/myforegroundcmd

[Install]
WantedBy=multi-user.target

La ventaja de esto es que la variable se mantiene en un solo archivo con la unidad. Por lo tanto, la unidad de archivo es más fácil moverse entre sistemas.

El valor de la Variable

Sin embargo, la solución anterior no funciona bien cuando sysadmin se supone que es para cambiar el valor de la variable de entorno local. Más específicamente, el nuevo valor sería necesario activar cada vez que la unidad de archivo se actualiza.

Para este caso, un archivo extra es para ser utilizado. Cómo depende, en general, la política de distribución.

Una solución particularmente interesante es el uso de /etc/systemd/system/myservice.service.d directorio. A diferencia de otras soluciones, este directorio es apoyado por systemd y, por tanto, no viene con la distribución de las rutas de acceso específicas.

En este caso, colocar un archivo como /etc/systemd/system/myservice.service.d/local.conf que se agrega la falta de piezas de la unidad de archivo:

[Service]
Environment="FOO=bar baz"

Después, systemd combina los dos archivos al iniciar el servicio (recuerde systemd daemon-reload después de cambiar cualquiera de ellos). Y ya que esta ruta es utilizada directamente por systemd, no se utiliza EnvironmentFile= de este.

Si el valor debe ser cambiado solamente en algunos de los sistemas afectados, usted puede combinar ambas soluciones, proporcionando un defecto directamente en la unidad y un local de reemplazo en el otro archivo.

53voto

paluh Puntos 271

http://0pointer.de/public/systemd-man/systemd.exec.html#Environment= - usted tiene dos opciones (una ya señalado por Michael):

Environment=

y

EnvironmentFile=

11voto

user1830432 Puntos 136

Michael dio una solución limpia pero quería tener actualizado env variable de secuencia de comandos. Por desgracia, la ejecución de comandos en bash no es posible en el archivo de unidad de systemd. Afortunadamente, usted puede desencadenar bash dentro de ExecStart:

http://www.dsm.fordham.edu/cgi-bin/man-cgi.pl?topic=systemd.service&ampsect=5

Tenga en cuenta que esta configuración no es directamente compatible con el shell de línea de comandos. Si el comando de shell de líneas son para ser utilizado necesitan ser aprobada explícitamente a una consola de la aplicación de algún tipo.

Ejemplo en nuestro caso es:

[Service]
ExecStart=/bin/bash -c "ENV=`script`; /bin/myforegroundcmd"

-1voto

jeffreypriebe Puntos 1070

¿Qué acerca de sólo poner la variable de entorno dentro de la myforegroundcmd script?

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: