¿Hay alguna manera de asignar dinámicamente variables de entorno en un archivo de unidad de servicio systemd?
Tenemos una máquina que tiene 4 GPU, y queremos activar múltiples instancias de un determinado servicio por GPU. P.ej:
- gpu_service @ 1: 1.service
- gpu_service @ 2: 1.service
- gpu_service @ 3: 1.service
- gpu_service @ 4: 1.service
- gpu_service @ 1: 2.service
- gpu_service @ 2: 2.service
- gpu_service @ 3: 2.service
- gpu_service @ 4: 2.service
- hasta el hastío
Entonces, 1: 1, 2: 1, etc. son efectivamente el% i en el archivo de la unidad de servicio.
Para que el servicio se una a una GPU particular, el ejecutable del servicio verifica una determinada variable de entorno, por ejemplo:
USE_GPU=4
¿Hay alguna manera de tomar% i dentro del archivo de la unidad de servicio y ejecutarlo a través de alguna función (shell) para obtener el número de GPU, y luego puedo configurar la variable de entorno USE_GPU en consecuencia?
Lo que es más importante, no quiero la molestia de escribir varios /etc/systemd/system/gpu_service@x:y.service/local.conf
archivos solo para poder activar más instancias.
bash -c
para iniciar un programa desde el archivo de la unidad? Llamarexec
? Esto es como usar una carretilla elevadora encima de una carretilla elevadora (tal vez con otra carretilla elevadora en la parte superior) porque la primera carretilla elevadora tiene problemas en realidad.No construido en el camino. Debe hacer estas cosas antes de que comience su servicio. Una forma sería ponerlo en un archivo de entorno.
fuente
Parece que realmente puede establecer variables de entorno dentro de un archivo de unidad systemd ...
Según las sugerencias de los comentaristas, aquí está la solución:
Texto citado tomado de la siguiente URL: https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html
fuente
Environment=ABC=%i
, establece ese entorno. variable "a la totalidad de% i". Supongo que podrías hacer un envoltorio para quitar las "cosas más allá de la cita" que no quieres, y se llama ejecutable real. Pero si está haciendo una envoltura, incluso podría pasar%i
como argumento, por ejemplo:ExecStart=my_wrapper %i
Es feo y no es exactamente lo que pediste, ni permite el inicio automático, pero para los seguidores es posible hacer algo usando el entorno systemctl :
Solo trato de enumerar todas las formas posibles :)
fuente