Есть ли способ динамически назначать переменные среды в файле системного модуля службы?
У нас есть машина с 4 графическими процессорами, и мы хотим увеличить количество экземпляров определенного сервиса на один графический процессор. Например:
- 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
- до тошноты
Таким образом, 1: 1, 2: 1 и т. Д. Фактически являются% i в файле единицы обслуживания.
Чтобы служба связывалась с конкретным графическим процессором, исполняемый файл службы проверяет определенную переменную среды, например:
USE_GPU=4
Есть ли способ, которым я могу взять% i внутри файла сервисного модуля и запустить его через некоторую (shell) функцию для получения номера GPU, а затем я могу соответственно установить переменную среды USE_GPU?
Самое главное, я не хочу, чтобы написание нескольких /etc/systemd/system/gpu_service@x:y.service/local.conf
файлов было просто так, чтобы я мог раскрутить больше экземпляров.
bash -c
чтобы запустить программу из файла модуля? Звонитьexec
? Это похоже на использование вилочного погрузчика поверх вилочного погрузчика (может быть, с другим грузоподъемником сверху), потому что первый вилочный погрузчик имеет проблемы с фактической погрузкой.Не построен в пути. Вы должны сделать это до того, как начнется ваше обслуживание. Одним из способов было бы поместить его в файл среды.
источник
Похоже, что вы действительно можете установить переменные окружения внутри системного файла systemd ...
Согласно предложениям комментаторов, вот решение:
Цитируемый текст взят со следующего URL: https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html
источник
Environment=ABC=%i
он устанавливает этот env. переменная "в целом% я". Я полагаю, вы могли бы сделать обертку для удаления ненужных «вещей, выходящих за рамки цитаты», и это вызвало бы настоящий исполняемый файл. Но если вы делаете обертку, вы можете просто передать ее%i
в качестве аргумента, например:ExecStart=my_wrapper %i
Это ужасно и не совсем то, о чем вы просили, и при этом не допускает автозапуска, но для фолловеров возможно сделать что-то, используя среду systemctl :
Просто пытаюсь перечислить все возможные пути :)
источник