Czy istnieje sposób dynamicznego przypisywania zmiennych środowiskowych w pliku systemowej jednostki usługowej?
Mamy maszynę, która ma 4 procesory graficzne i chcemy rozdzielić wiele wystąpień pewnej usługi na GPU. Na przykład:
- gpu_service @ 1: 1. usługa
- gpu_service @ 2: 1. usługa
- gpu_service @ 3: 1. usługa
- gpu_service @ 4: 1. usługa
- gpu_service @ 1: 2.service
- gpu_service @ 2: 2.service
- gpu_service @ 3: 2.service
- gpu_service @ 4: 2.service
- do znudzenia
Zatem 1: 1, 2: 1 itd. Są faktycznie% i w pliku jednostki usługowej.
Aby usługa mogła się połączyć z określonym GPU, plik wykonywalny usługi sprawdza określoną zmienną środowiskową, np .:
USE_GPU=4
Czy istnieje sposób, aby pobrać% i do pliku jednostki usługowej i uruchomić go przez jakąś funkcję (powłoki) w celu uzyskania numeru GPU, a następnie odpowiednio ustawić zmienną środowiskową USE_GPU?
Co najważniejsze, nie chcę kłopotów z pisaniem wielu /etc/systemd/system/gpu_service@x:y.service/local.conf
plików tylko po to, aby móc rozpędzić więcej instancji.
bash -c
aby uruchomić program z pliku jednostki? Zadzwonićexec
? To jest jak używanie wózka widłowego na wózku widłowym (może z innym wózkiem widłowym na górze), ponieważ pierwszy wózek ma problemy z wózkiem widłowym.Nie wbudowany w sposób. Musisz zrobić te rzeczy przed rozpoczęciem usługi. Jednym ze sposobów byłoby umieszczenie go w pliku środowiska.
źródło
Wygląda na to, że rzeczywiście można ustawić zmienne środowiskowe w pliku jednostkowym systemd ...
Zgodnie z sugestiami komentujących, oto rozwiązanie:
Cytowany tekst pochodzi z następującego adresu URL: https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html
źródło
Environment=ABC=%i
, ustawia to środowisko. zmienna „do całości% i”. Myślę, że możesz zrobić opakowanie, aby usunąć „rzeczy poza cytatem”, których nie chcesz, i nazywa to prawdziwym plikiem wykonywalnym. Ale jeśli robisz opakowanie, możesz nawet%i
podać go jako argument, np .:ExecStart=my_wrapper %i
To brzydkie i niezupełnie to, o co prosiłeś, ani nie pozwala na autostart, ale dla obserwujących można zrobić coś przy użyciu środowiska systemctl :
Próbuję wymienić wszystkie możliwe sposoby :)
źródło