Intereting Posts
Каталог для файла с паролем Luks key Sendmail SMTP «Мое безоговорочное имя хоста» и «Мое безоговорочное доменное имя» Модули ядра Virtualbox не загружаются при загрузке Почему Bash игнорирует SIGINT, если его текущий управляющий ребенок справляется с этим? Подключить текущий MAC-адрес к известному адресу, чтобы обмануть маршрутизатор и устройство регистрации xargs не генерирует правильную команду Изменение размера шрифта по умолчанию для отдельной учетной записи в KDE Почему wc получает неправильный результат с выходом из ps Есть ли способ запустить процесс параллельно в цикле скрипта bash Как изменить цвет всех основных моментов в файле PDF? Как запустить приложение GUI на X11-сервере удаленного сервера через SSH Как перенести файлы из одного каталога во вложенный каталог с помощью SSH? Установка linux-3.14.8 un Arch Linux пока 3.15 уже тестируется мониторинг изменений файлов + доступ к файлам «Ключи GPG, перечисленные для репозитория« atomicrocketturtle.com », уже установлены, но они неверны для этого пакета».

Динамические переменные в файлах модулей systemd

Есть ли способ динамически назначать переменные среды в файле unitd service unit?

У нас есть машина с 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
  • ad nauseam

Таким образом, 1: 1, 2: 1 и т. Д. Фактически являются% i в файле служебной единицы.

Чтобы служба связывалась с конкретным графическим процессором, исполняемый файл службы проверяет определенную переменную среды, например:

USE_GPU=4 

Есть ли способ, который я могу взять% i внутри файла служебной единицы и запустить его через некоторую (оболочку) функцию, чтобы получить номер GPU, и затем я могу установить переменную среды USE_GPU соответственно?

Самое главное, я не хочу, чтобы писать несколько файлов /etc/systemd/system/gpu_service@x:y.service/local.conf чтобы я мог развернуть больше экземпляров.

Если вы будете осторожны, вы можете включить небольшую последовательность сценариев bash как команду exec в файле служебных данных экземпляра. Например

 ExecStart=/bin/bash -c 'v=%i; USE_GPU=$${v%:*} exec /bin/mycommand' 

$$ в строке станет единственным $ в результате, переданном bash, но что более важно остановит ${...} от интерполирования systemd. (Более ранние версии systemd не документировали использование $$ , поэтому я не знаю, поддерживался ли он тогда).

Похоже, вы действительно можете установить переменные среды внутри файла systemd unit …

В предложениях от комментаторов, вот решение:

Использование переменных среды в единицах systemd

Директива по окружающей среде

systemd имеет директиву среды, которая устанавливает переменные среды для выполняемых процессов. Он принимает список переменных, разделенных пробелами. Эта опция может быть указана более одного раза, и в этом случае все перечисленные переменные будут установлены. Если одна и та же переменная установлена ​​дважды, более поздняя установка переопределит предыдущую настройку. Если для этой опции назначена пустая строка, список переменных среды сбрасывается, все предыдущие присвоения не влияют. Директивы окружения используются во встроенных модулях Container Linux systemd, например, в etcd2 и фланеле.

В приведенном ниже примере вы можете настроить демона etcd2 для использования шифрования. Просто создайте папку /etc/systemd/system/etcd2.service.d/30-certificates.conf для etcd2.service:

 [Service] # Client Env Vars Environment=ETCD_CA_FILE=/path/to/CA.pem Environment=ETCD_CERT_FILE=/path/to/server.crt Environment=ETCD_KEY_FILE=/path/to/server.key # Peer Env Vars Environment=ETCD_PEER_CA_FILE=/path/to/CA.pem Environment=ETCD_PEER_CERT_FILE=/path/to/peers.crt Environment=ETCD_PEER_KEY_FILE=/path/to/peers.key 

Затем запустите sudo systemctl daemon-reload и sudo systemctl restart etcd2.service чтобы применить новые среды к демонам etcd2.

Цитированный текст, взятый по следующему URL-адресу: https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html

Нет встроенного пути. Вам нужно сделать это до начала вашего обслуживания. Один из способов – поместить его в файл окружения.

 [Service] # Note you need to escape percentage sign ExecStartPre=/bin/sh -c "my_awesome_parser %%i > /run/gpu_service_%i" EnvironmentFile=/run/gpu_service_%i ExecStart=...