Existe uma maneira de atribuir dinamicamente variáveis de ambiente em um arquivo de unidade de serviço systemd?
Temos uma máquina com 4 GPUs e queremos ativar várias instâncias de um determinado serviço por GPU. Por exemplo:
- 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
- ad nauseam
Portanto, 1: 1, 2: 1 etc. são efetivamente o% i no arquivo da unidade de serviço.
Para que o serviço se ligue a uma GPU específica, o executável do serviço verifica uma determinada variável de ambiente, por exemplo:
USE_GPU=4
Existe uma maneira de eu levar% i dentro do arquivo da unidade de serviço e executá-lo através de alguma função (shell) para derivar o número da GPU e, em seguida, posso definir a variável de ambiente USE_GPU de acordo?
Mais importante, eu não quero o trabalho de escrever vários /etc/systemd/system/gpu_service@x:y.service/local.conf
arquivos, apenas para poder gerar mais instâncias.
bash -c
para iniciar um programa a partir do arquivo da unidade? Ligarexec
? É como usar uma empilhadeira em cima de uma empilhadeira (talvez com outra empilhadeira em cima), porque a primeira empilhadeira tem problemas para realmente fazer a empilhadeira.Não construído de maneira. Você precisa fazer essas coisas antes do início do serviço. Uma maneira seria colocá-lo em um arquivo de ambiente.
fonte
Parece que você pode realmente definir variáveis de ambiente dentro de um arquivo de unidade systemd ...
Por sugestões dos comentaristas, aqui está a solução:
Texto citado extraído do seguinte URL: https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html
fonte
Environment=ABC=%i
, defina esse env. variável "na totalidade de% i". Eu acho que você poderia criar um invólucro para retirar as "coisas além da citação" que você não deseja e chamar o executável real. Mas se você está fazendo um invólucro, você poderia até mesmo passar%i
como um argumento para que ex:ExecStart=my_wrapper %i
É feio e não é exatamente o que você solicitou, nem permite a inicialização automática, mas para os seguidores é possível fazer algo usando o ambiente systemctl :
Apenas tentando listar todas as maneiras possíveis :)
fonte