Los tiempos cambian y las mejores prácticas también.
La mejor forma actual de hacerlo es ejecutar systemctl edit myservice
, lo que creará un archivo de anulación para usted o le permitirá editar uno existente.
En instalaciones normales, esto creará un directorio /etc/systemd/system/myservice.service.d
, y dentro de ese directorio creará un archivo cuyo nombre termina en .conf
(típicamente override.conf
), y en este archivo puede agregar o anular cualquier parte de la unidad enviada por la distribución.
Por ejemplo, en un archivo /etc/systemd/system/myservice.service.d/myenv.conf
:
[Service]
Environment="SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN"
Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd"
¡Tenga en cuenta también que si el directorio existe y está vacío, su servicio estará deshabilitado! Si no tiene la intención de poner algo en el directorio, asegúrese de que no exista.
Como referencia, la antigua forma era:
La forma recomendada de hacer esto es crear un archivo /etc/sysconfig/myservice
que contenga sus variables y luego cargarlas EnvironmentFile
.
Para obtener detalles completos, consulte la documentación de Fedora sobre cómo escribir un script systemd .
sysconfig
ruta es específica de Fedora, pero la pregunta es sobre Arch Linux. La respuesta de paluh es más interesante, creo/etc/sysconfig
es específico de Fedora. AFAIR Arch Linux estaba presionando para tener los archivos de configuración en algún lugar específico del paquete en/etc
lugar de esa ubicación específica de Fedora. Me gusta/etc/myservice.conf
, aunque el uso de archivos adicionales no parece la forma correcta aquí.DJANGO_SETTINGS_MODULE=project.settings
uno por línea.La respuesta depende de si se supone que la variable es constante (es decir, no debe ser modificada por el usuario que obtiene la unidad) o variable (se supone que debe ser establecida por el usuario).
Como es su unidad local, el límite es bastante borroso y de cualquier manera funcionaría. Sin embargo, si comenzaste a distribuirlo y terminaría en
/usr/lib/systemd/system
, esto sería importante.Valor constante
Si el valor no necesita cambiar por instancia, la forma preferida sería colocarlo como
Environment=
, directamente en el archivo de la unidad:La ventaja de esto es que la variable se mantiene en un solo archivo con la unidad. Por lo tanto, el archivo de la unidad es más fácil de mover entre sistemas.
Valor variable
Sin embargo, la solución anterior no funciona bien cuando se supone que sysadmin cambia el valor de la variable de entorno localmente. Más específicamente, el nuevo valor debería establecerse cada vez que se actualiza el archivo de la unidad.
Para este caso, se utilizará un archivo adicional. Cómo: generalmente depende de la política de distribución.
Una solución particularmente interesante es usar el
/etc/systemd/system/myservice.service.d
directorio. A diferencia de otras soluciones, este directorio es compatible con el sistema en sí y, por lo tanto, no incluye rutas específicas de distribución.En este caso, coloca un archivo como
/etc/systemd/system/myservice.service.d/local.conf
ese que agrega las partes faltantes del archivo de la unidad:Posteriormente, systemd combina los dos archivos al iniciar el servicio (recuerde
systemctl daemon-reload
después de cambiar cualquiera de ellos). Y dado que systemd usa esta ruta directamente, no la usaEnvironmentFile=
para esto.Si se supone que el valor debe cambiarse solo en algunos de los sistemas afectados, puede combinar ambas soluciones, proporcionando un valor predeterminado directamente en la unidad y una anulación local en el otro archivo.
fuente
systemctl daemon-reload
es el comando para recargar systemdEnvironmentFile=
es mejor cuando los valores son secretos como contraseñas. Vea mi respuesta para más detalles.http://0pointer.de/public/systemd-man/systemd.exec.html#Environment= : tiene dos opciones (una ya señalada por Michael):
y
fuente
Las respuestas de Michael y Michał son útiles y responden a la pregunta original de cómo establecer una variable de entorno para un servicio systemd. Sin embargo, un uso común para las variables de entorno es configurar datos confidenciales como contraseñas en un lugar que no se comprometerá accidentalmente con el control de origen con el código de su aplicación.
Si es por eso que desea pasar una variable de entorno a su servicio, no la use
Environment=
en el archivo de configuración de la unidad. ÚseloEnvironmentFile=
y apúntelo a otro archivo de configuración que solo pueda leer la cuenta de servicio (y los usuarios con acceso de root).Los detalles del archivo de configuración de la unidad son visibles para cualquier usuario con este comando:
Puse un archivo de configuración en
/etc/my_service/my_service.conf
y puse mis secretos allí:Luego, en mi archivo de unidad de servicio, utilicé
EnvironmentFile=
:Verifiqué que
ps auxe
no puedo ver esas variables de entorno, y otros usuarios no tienen acceso/proc/*/environ
. Verifique su propio sistema, por supuesto.fuente
Michael dio una solución limpia, pero quería obtener una variable env actualizada del script. Desafortunadamente, la ejecución de comandos bash no es posible en el archivo de unidad systemd. Afortunadamente, puedes activar bash dentro de ExecStart:
http://www.dsm.fordham.edu/cgi-bin/man-cgi.pl?topic=systemd.service§=5
Ejemplo en nuestro caso es entonces:
fuente
/bin/bash -a -c 'source /etc/sysconfig/whatever && exec whatever-program'
. Esto-a
garantiza que el entorno se exporte al subproceso (a menos que desee prefijar todas las variableswhatever
conexport
)ExecStart=/usr/bin/env ENV=script /bin/myforegroundcmd
sea una solución un poco mejor en este caso.