Estoy tratando de crear un systemd
servicio;
Este servicio tiene un script que se supone que usa algunas variables de entorno;
Así que creé esto:
cat /etc/systemd/system/atlantis-server.service
[Service]
ExecStart=/usr/local/bin/atlantis-server.sh
Que apunta a esto
[email protected]:~$ cat /usr/local/bin/atlantis-server.sh
#!/bin/bash
source /etc/environment
atlantis server --atlantis-url="$URL" --gitlab-user="$USERNAME" --gitlab-token="$TOKEN" --gitlab-webhook-secret="$SECRET" --gitlab-hostname="$HOSTNAME" --repo-whitelist="$REPO_WHITELIST"
Lo que noté (después de algunos errores en mi systemd
logs) es que tuve que explícitamente source /etc/environment
(aquí es donde se declaran las variables anteriores).
¿Por qué es necesario?
¿No son visibles globalmente?
editar :Agregar esto a la definición del servicio no resolvió el problema
Environment=/etc/environment
Respuesta aceptada:
/etc/environment
no es un archivo de configuración global.
Se aplica solo en Linux; solo a las sesiones PAM, según lo empleado por login
Etcétera; y solo en el caso de que un complemento PAM en particular esté instalado y habilitado en el sistema, y donde ese complemento PAM no se haya configurado para usar algún otro archivo (porque /etc/environment
es simplemente su valor predeterminado si no se le indica lo contrario). Es ese complemento PAM el que lo lee.
De lo contrario, es solo un archivo sin sentido en /etc
que nada usa.
Mientras que podrías establecer variables de entorno globalmente en systemd-system.conf
, esto se aplica a todos servicios, no solo a los que desea cambiar.
Del mismo modo, mientras que un EnvironmentFile
en las unidades de servicio apropiadas es una manera de hacer que systemd lea un archivo común con una lista de definiciones de variables de entorno, la gente de systemd desaconseja su uso. Consideran EnvironmentFile
como una mala idea, y su uso como un error.
La forma correcta de hacer esto según la gente de systemd es configurar cada variable en la unidad de servicio con un Environment
configuración, que contiene el nombre y el valor de la variable de entorno real para establecer, no un nombre de archivo. Esto puede ser directamente en la unidad de servicio relevante, si como aquí uno está escribiendo su propia unidad de servicio para colocarla en /etc
; o estar en un .conf
anular el archivo, si uno está ajustando una unidad de servicio preempaquetada en /lib
o /usr/lib
.
Lecturas adicionales
- https://unix.stackexchange.com/a/419061/5132
- Lennart Poettering et al. (2016).
systemd-system.conf
. páginas del manual systemd. Freedesktop.org. - Lennart Poettering et al. (2016).
systemd.exec
. páginas del manual systemd. Freedesktop.org. - Andrew G. Morgan y Thorsten Kukuk (agosto de 2010). “pam_env — establecer/desestablecer variables de entorno“. Guía del administrador del sistema Linux-PAM . linux-pam.org.